본문 바로가기

Android/지식저장소

[Android] 점선 그리기(Dotted line)

앱에서 점선을 나타내고 싶을 때 아래와 같은 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" 적용)

SM-P580, API 27

 

다른 디바이스에서는 따로 설정해주지 않아도 제대로 보인다.

SM-T830, API 29

 

android:layerType 속성은 은 뷰를 렌더링하는 연산을 CPU(software)에 맡길지, GPU(hardware)에 맡길지 결정하는 속성이다. 앱 전반적으로 또는 액티비티로 아래와 같은 속성을 추가하면 적용할 수 있다. (해당 속성이 세팅되지않았을 때에도 되는걸로 보아 디폴트는 true 인 것 같다.)

android:hardwareAccelerated="true"

 

위에 추가한 것 처럼  단위로도 지정가능한데 그때 사용되는 속성이 layerType 이다. android:hardwareAccelerated 속성과 함께 사용하면 일부 뷰에서만 software 방식으로 렌더링을 하도록 지정할 수 있다.

하드웨어 가속에 대한 설명이 궁금하다면 여기!


주의해야할 점은 바로 일부 API 레벨에서 아직 하드웨어 가속을 지원하지 않는 메서드들이 있다는 것이다.

깔끔하게 딱 잘라서 어떤 API 까지 렌더링 다 잘된다, 라고 되어있는게 아니라 일부 메서드들에 제한이 붙어있어서 여러가지 케이스가 있을 수 있으니 공식문서를 참고해보자.

 

하드웨어 가속  |  Android 개발자  |  Android Developers

Android 3.0(API 레벨 11)부터 Android 2D 렌더링 파이프라인 하드웨어에서는 가속화를 지원하므로, View의 캔버스에서 실행되는 모든 그리기 작업에서 GPU를 사용합니다. 하드웨어 가속을 사용하려면 필

developer.android.com

 

우리 앱에서는 application 레벨에 위 옵션이 true 로 되어있었는데, 점선을 그릴 때 580 디바이스(API 27)에서 지원하지 않는 메서드를 사용하기때문인 것 같다. 꽤 높은 버전인데도 지원되지 않는게 있다는것에 좀 놀랐다.

그래서 모든 디바이스에서 정확하게 잘 보이게 하려면 android:hardwareAccelerated="false" 로 하는게 안전할 것 같지만, 그렇게되면 직접 그린 커스텀뷰들이 제대로 안보이거나 애니메이션이 엄청나게 버벅일 것이다. (false 로 바꿔보니 우리앱은 대환장파티가 열렸다 ㅠㅠ)

 

아무튼 렌더링 성능을 높이기 위해서는 true 로 설정해주는것이 좋고, 만약 렌더링이 제대로 안되는 뷰가 있다면 일단 layerType 을 software 로 설정해보고 해당 API 에서 하드웨어 가속을 지원하는지 여부를 알아보자.