앱에서 점선을 나타내고 싶을 때 아래와 같은 shape.xml 리소스를 만들고
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<stroke
android:width="1dp"
android:color="#AAAAAA"
android:dashWidth="2dp"
android:dashGap="1dp" />
</shape>
* 참고로 shape - line 을 정의할 때에는 stroke 속성이 꼭 정의되어야한다고 문서에 나와있다.
그리고자 하는 뷰를 추가하고 위에서 정의한 xml 리소스를 background 로 설정해주면 끝!
<View
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layerType="software"
android:background="@drawable/dash_gap_line_aaaaaa" />
그런데 android:layerType 속성을 software 을 설정하지 않을 경우, 아래처럼 제대로 보이지 않는 경우가 있다. (첫번째 뷰에만 android:layerType="software" 적용)
다른 디바이스에서는 따로 설정해주지 않아도 제대로 보인다.
android:layerType 속성은 은 뷰를 렌더링하는 연산을 CPU(software)에 맡길지, GPU(hardware)에 맡길지 결정하는 속성이다. 앱 전반적으로 또는 액티비티로 아래와 같은 속성을 추가하면 적용할 수 있다. (해당 속성이 세팅되지않았을 때에도 되는걸로 보아 디폴트는 true 인 것 같다.)
android:hardwareAccelerated="true"
위에 추가한 것 처럼 뷰 단위로도 지정가능한데 그때 사용되는 속성이 layerType 이다. android:hardwareAccelerated 속성과 함께 사용하면 일부 뷰에서만 software 방식으로 렌더링을 하도록 지정할 수 있다.
하드웨어 가속에 대한 설명이 궁금하다면 여기!
주의해야할 점은 바로 일부 API 레벨에서 아직 하드웨어 가속을 지원하지 않는 메서드들이 있다는 것이다.
깔끔하게 딱 잘라서 어떤 API 까지 렌더링 다 잘된다, 라고 되어있는게 아니라 일부 메서드들에 제한이 붙어있어서 여러가지 케이스가 있을 수 있으니 공식문서를 참고해보자.
우리 앱에서는 application 레벨에 위 옵션이 true 로 되어있었는데, 점선을 그릴 때 580 디바이스(API 27)에서 지원하지 않는 메서드를 사용하기때문인 것 같다. 꽤 높은 버전인데도 지원되지 않는게 있다는것에 좀 놀랐다.
그래서 모든 디바이스에서 정확하게 잘 보이게 하려면 android:hardwareAccelerated="false" 로 하는게 안전할 것 같지만, 그렇게되면 직접 그린 커스텀뷰들이 제대로 안보이거나 애니메이션이 엄청나게 버벅일 것이다. (false 로 바꿔보니 우리앱은 대환장파티가 열렸다 ㅠㅠ)
아무튼 렌더링 성능을 높이기 위해서는 true 로 설정해주는것이 좋고, 만약 렌더링이 제대로 안되는 뷰가 있다면 일단 layerType 을 software 로 설정해보고 해당 API 에서 하드웨어 가속을 지원하는지 여부를 알아보자.
'Android > 지식저장소' 카테고리의 다른 글
[Android] 간단한 그리기 및 지우기 with S-Pen (1) | 2021.05.14 |
---|---|
[Android] ConstraintLayout Helper - Group (0) | 2021.01.11 |
[Android] BaseSavedState 를 이용하여 View 에 상태 저장하기 (0) | 2020.09.15 |
[Android] RxJava2 + Retrofit2 에서 언제 call 이 cancel 되는가 고찰 (0) | 2020.09.10 |
[Android] RecyclerView 에서 엣지 스크롤 이펙트 숨기기 (0) | 2020.09.09 |