본문 바로가기

프로그래밍/안드로이드

[안드로이드] 그리기 객체

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

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

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


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


1. 그리기 객체



 1.1 Bitmap


Resources 객체를 얻기 위한 메서드 


Resources ContextWrapper.getResources()

Resources View.getResources()


객체를 얻은 후 리소스의 드로블(Drawable)을 읽는다.


Drawable Resources.getDrawable (int id)


인수로 리소스의 ID를 전달하면 해당 리소스를 리턴한다.

비트맵을 읽는다면 BitmapDrawable 타입의 객체가 리턴될 것이다.

이 객체로부터 출력에 사용할 수 있는 비트맵을 얻으려면 getBitmap 메서드를 호출한다.


Bitmap BItmapDrawable.getBitmap()


결국 비트맵 하나를 읽기 위해서는 다음 세 줄을 연속적으로 호출해야 한다.


Rsources res = getResources();                                           // 리소스 관리자 얻음

BitmapDrawable bd = (BitmapDrawable)res.getDrawable(ID);  // 비트맵 드로블 읽음

Bitmap bit = bd.getBitmap();                                              // 비트맵 추출


다음 한 줄로도 읽을 수 있다. 일종의 래퍼 메서드(?)이다.


Bitmap bit = BItmapFactory.decodeResources(getResources(), ID);



 1.2 텍스트


텍스트 출력 메서드는 다음 4가지로 오버로딩(Overloading)되어 있다.


void drawText (String text, float x, float y, Paint paint)  // 지정 좌표에 문자열 전체 출력

void drawText (String text, int start, int end, float x, float y, Paint paint) // 일부 문자열 출력

void drawText (char[] text, int index, int count, float x, float y, Paint paint) // 일부 문자열 출력

void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint) //패스 출력


다음은 텍스트의 출력 속성을 변경하는 Paint의 메서드이다.


void setTextAlign (Paint.Align align)                        // 정렬

void setTextSize (float textSize)                              // 크기

Typeface setTypeface (Typeface typeface)                // 타입페이스

void setUnderlineText (boolean underlineText)         // 밑줄

void setStrikeThruText (boolean strikeThruText)       // 취소선

void setSubpixelText (boolean subpixelText)

void setTextSkewX (float skewX)                            // 글자 기울기

void setTextScaleX (float scaleX)                            // X축 확대 배율


예제로 살펴보자. 쉽게 이해할 수 있을 것이다.



<수평 정렬>


궁금증 하나. Left Align은 왼쪽 정렬이라는 뜻인데 왜 그림상에서는 오른쪽에 맞추어져 있을까?



그 이유는 수평좌표(x축) 100을 기준으로 정렬을 하기 때문이다.


수평좌표 100에서 이어진 가상의 선을 기준으로 정렬을 한다. 


<수직 정렬>


drawText의 y좌표는 항상 문자열의 아래쪽 좌표이다.


외부 폰트 가져오기 메서드 


mFont = Typeface.createFromAsset ( getAssets() ,  "abc.ttf");


그러나, 한글폰트는 지원하지 않는다.


 1.3 Path (추후 포스팅)


직선, 곡선, 다각형 등의 도형 궤적 정보를 가지는 그래픽 객체이다.


캔버스의 drawPath 메서드를 호출해야 한다.


void moveTo(float x, float y)

void lineTo(float x, float y)

void addCircle(float x, float y, float radius, Path.Direction dir)

void addRect(RectF rect, Path.Direction dir)

void quadTo(float x1, float y1, float x2, float y2)

void cubicTo(float x1, float y1, float x2 float y2, float x3, float y3)