[Android] 커스텀 뷰

홈런볼·2022년 9월 2일
0

안드로이드

목록 보기
4/10

안드로이드에서 기본적으로 제공하는 UI요소 말고, 사용자가 커스텀할 수 있는 뷰를 만들 수 있다.

View

안드로이드의 다양한 UI는 모두 View를 상속한다.
View를 상속하여 UI의 외형 뿐만 아니라 이벤트를 처리한다.

View를 상속받은 클래스는 onDraw() 함수를 재정의 해야한다.
재 정의한 후 함수의 인자로 전달되는 Canvas로 다양한 그래픽 요소를 그릴 수 있다.

class CustomView : View {
    
    constructor(context : Context) : super(context)
    constructor(context : Context,attrs: AttributeSet) : super(context,attrs)

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        
    }
}

레이아웃에서 커스텀 뷰를 사용하기 위해서는 기본 생성자 뿐만 아니라 AttirbuteSet을 인자로 가진 생성자로 정의해야 한다.

constructor(context : Context,attrs: AttributeSet) : super(context,attrs)

AttributeSet은 XML에서 View를 생성할 때 값을 설정 하는 객체이다.
이 객체가 없다면 안드로이드는 xml관련 오류를 반환한다.

클래스에서 정의후 레이아웃에서 view를 호출해서 사용할 수 있다.

<view
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="패키지이름.CustomView">

클래스에 정의한 커스텀 뷰를 사용하기 위해서는 class 속성에 CustomView 의 위치를 지정해야한다.

Canvas

canvas 객체는 다양한 메소드를 제공한다

  • drawColor() : 배경색을 지정하는 함수이다.
  • drawPoint() : 점을 그릴 수 있다.
  • drawLine() : 선을 그릴 때 사용한다.
  • drawRect(), drawRoundRect() : 사각형, 둥근 사각형을 그릴때 사용한다.
  • drawCircle(), drawOval() : 원, 타원을 그릴때 사용한다.
  • drawPath() : 경로를 그릴때 사용한다.

Paint

Canvas객체 뿐만 아니라 onDraw 함수 안에서 Paint객체도 호출 가능하다.

Paint의 속성, 메소드로는 글자크기를 결정하는 textSize 속성, 폰트를 결정하는 typeface 속성, 초기화를 진행하는 reset() 메소드가 있다.

View의 메소드

View는 다양한 메소드를 지원하는데, 그중에서도 대표적인 이벤트는 화면을 그리는onDraw() 와 사용자 터치이벤트를 지원하는onTouchEvent() 이다.

onDraw 는 View가 그려질 필요가 있을 때 시스템이 알아서 호출한다.
그러므로 원하는 때 다시 화면을 그리게 하려면 View함수가 지원하는 invalidate() 함수를 호출한다.

onTouchEvent는 모션이벤트를 인자로 가지고 있기 때문에 재정의 하여 터치이벤트를 처리할 수 있다.

override fun onTouchEvent(event: MotionEvent): Boolean {
        if(event.action == MotionEvent.ACTION_DOWN){
            // 이벤트 내용
            return true
        }
        return super.onTouchEvent(event)
    }

이벤트가 끝나는 경우에는 반드시 true를 반환해야 한다.
true 를 반환하지 않으면 시스템이 반복적으로 onTouchEvent를 상위 핸들러로 전달하게 되고, 반복해서 해당 이벤트가 호출되는 문제가 발생한다.

또한 뷰에 정의한 터치이벤트가 아닌 뷰를 사용하는 액티비티에서 뷰의 터치이벤트를 적용해야 되는 경우도 있다.
하지만 이런 경우 커스텀 뷰에 setOnclickListner를 등록해도 출력이 발생하지 않는다. 그 이유는 앞서 정의한 onTouchEvent 에서 true를 리턴하기 때문에 클릭이 발생하지 않는다.

클릭 이벤트가 발생하기 위해서는 View에서 제공하는 performClick() 메소드를 호출해 뷰의 정의한 터치이벤트와 액티비티에서 전달하는 터치이벤트가 둘 다 출력된다.


Reference

0개의 댓글