본문 바로가기

프로그래밍/안드로이드

[안드로이드] 캔버스(Canvas)

※ 저는 안드로이드 프로그래밍 정복(김상형 著, 한빛미디어) 책을 이용해 공부하고 있으며

예제와 코드는 이 책을 통해 공부중임을 밝힙니다.

개인적인 공부를 하면서 정리한 형식이기 때문에 심각한 오류가 있을 수 있습니다. 피드백 주시면 정말 감사하겠습니다.


※ 안드로이드 프로그래밍 정복(239p~255p) 참조


1. 커스텀 뷰



게임 캐릭터를 커스터마이징 한다고 하면 자기 입맛대로 캐릭터를 만드는 것을 뜻한다. 

커스텀 뷰(Custom View)는 말 그대로 뷰(View)를 상속(extends)받아 사용자 입맛에 맞게 만드는 것이다.


캔버스에 직접 출력하려면 View를 상속 받아 커스텀 뷰를 정의해야 한다.

맨 위를 살펴보면 MyView 객체를 생성하고 있다. 이 뷰를 setContentView로 전달하여서

액티비티 전체를 "커스텀 뷰"로 채웠다.


커스텀 뷰(Custom View)는 말 그대로 부모에 해당하는 뷰(View)를 상속(extends)받는 것을 의미한다.

그렇다면 여기서 커스텀 뷰는 MyView라는 것을 쉽게 알 수 있다.


MyView 클래스를 살펴보면 1개의 생성자와 1개의 메서드로 정의되어 있는 것을 볼 수 있다.

① MyView 생성자 ② onDraw 메서드


그리기를 수행하는 View와 onDraw 메서드를 재정의하기 위해 부모 클래스(View)를 상속받아

 커스텀 뷰를 액티비티 내부에 채우고 onDraw메서드에서 캔버스에 출력한다.


 [ JAVA 기본 상식 ] 

   생성자는 상속되지 않으므로 부모가 디폴트 생성자를 제공하지 않는 한 직접 정의해야 한다.

   대부분의 초기화는 부모 클래스가 수행하므로 생성자는 super 키워드로 부모의 생성자만 호출한다.


   생성자에 대한 기본 개념이 부족하다면 다음 링크를 타고 들어가 공부해보자.

   http://whatisthenext.tistory.com/1


뷰(VIew)는 "화면에 그리기"를 수행할 때 onDraw 메서드를 호출한다.

이때, 그리기에 필요한 캔버스 객체가 인수 (Canvas canvas) 로 전달된다.

사실상 onDraw 메서드가 "핵심 코드"이며 여기서 원을 그리던 네모를 그리던 별을 그릴 수 있는 것이다.



2. Canvas


void drawPoint (float x, float y, Paint paint)

void drawLine (float startX, float startY, float stopX, float stopY, Paint paint)

void drawCircle (float cx, float cy, float radius, Paint paint)

void drawRect (float left, float top, float right, float bottom, Paint paint)

void drawText (String text, float x, float y, Paint paint)



위 메서드를 살펴보면 꼭 마지막 인수로 "Paint paint"가 전달되는 것을 알 수 있다.

즉, 색상, 글꼴, 스타일, 그리기 모드를 설정하고 Paint 객체를 던져주면 적절하게 채워진다.

<위 예제에서는 Paint 객체를 파란색으로 설정한 것을 볼 수 있다. >


이게 가장 기본적인 원형이며 각 메서드는 원형 외에 인수에 따라 몇 가지 오버로드(링크)가 제공된다.

도형을 그리는 방법은 여러가지가 존재할 텐데, 한 방법으로만 그리면 비효율적이기 때문이다.





3. Paint


Paint 객체는 그리기에 대한 "속성 정보"를 가지며 모든 그리기 메서드에게 인수로 전달된다.


여기서 자주 사용되는 메서드는 void setAntiAlias (boolean aa)



아래 원이 좀 더 매끄럽다는 걸 체감(?)할 수 있을 것이다.




4. Paint 객체 관리


화면을 그려야 할 때마다 onDraw 메서드를 호출해 속성을 일일이 정해줘야 한다면 낭비이다.

Paint 타입의 Pnt를 MyView 생성자 부분에 만들어놓고, 필요할 때마다 객체를 가져다 쓰자.


참고할 메서드


void set (Paint src) : Paint 객체끼리 대입

void reset() : Paint 객체를 디폴트 상태로 만들기