참고 url : http://developer.android.com/guide/topics/ui/how-android-draws.html
뷰를 새로 만들거나 기존 뷰를 재정의해서 만들 수 있다.
1. 기존 뷰를 재정의해서 만들기
- 기존 뷰의 기능을 그대로 쓰고 외양만 바꾼다거나 할 때 사용한다.
- 이 때, onDraw 함수를 재정의 해서 모양새를 변경할 수 있다.
예를 들어 To do list 어플을 만든다고 할 때, 리스트 뷰에 텍스트 뷰를 아이템을 사용하면 된다.
이때, 텍스트뷰에 디자인요소를 보기좋게 아래와 같이 바꾼다고 가정해 보자.
그래서 텍스트 뷰를 상속받은 TodoListItemView 라고 클래스를 아래와 같이 작성하면 된다.
public class TodoListItemView extends TextView {
private Paint marginPaint;
private Paint linePaint;
private int paperColor;
private float margin;
public TodoListItemView(Context context, AttributeSet ats, int ds){
super(context, ats, ds);
init();
}
public TodoListItemView(Context context, AttributeSet ats){
super(context, ats);
init();
}
public TodoListItemView(Context context){
super(context);
init();
}
private void init(){
Resources myResources = getResources();
marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
marginPaint.setColor(myResources.getColor(R.color.notepad_margin));
linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
linePaint.setColor(myResources.getColor(R.color.notepad_lines));
paperColor = myResources.getColor(R.color.notepad_paper);
margin = myResources.getDimension(R.dimen.notepad_margin);
}
public void onDraw(Canvas canvas){
canvas.drawColor(paperColor);
canvas.drawLine(0, 0, 0, getMeasuredHeight(), linePaint);
canvas.drawLine(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), linePaint);
canvas.drawLine(margin, 0, margin, getMeasuredHeight(), marginPaint);
canvas.save();
canvas.translate(margin, 0);
super.onDraw(canvas);
canvas.restore();
}
}
다른 부분은 넘어가더라도 onDraw 함수에 Canvas 객체를 보다.
모든 View 클래스를 상속받은 뷰들 (여기에서는 TextView 도 해당된다.)은 시스템에게 받은 Canvas 를 통해서 그러내는데 쉽게 표현하면 도화지에 그림을 그린다고 생각하면 된다.
즉, Canvas 클래스에는 그리기, 이미지처리, 이동, 회전 등의 그릴수 있는 모든 함수들을 가지고 있다.
위의 소스를 보면 리스트아이템의 왼쪽, 아래쪽 경계선을 긋고 할일텍스트 옆에 보기좋게 빨강선을 그었다.
여기에서 getMeasureWidth(), getMeasureHeight() 함수를 볼 수 있는데 이부분은 이 컨트롤의 크기를 가져다 주는 함수들이다.
재정의하는 뷰들은 자체적을 자신의 크기를 정하는 로직을 포함하고 있기 때문에 이렇게 뷰 자신이 크기를 가져와 그릴수 있는데 새로운 뷰를 만들때에는 onMeasure() 함수를 재정의하여 그 크기를 정해줘야 한다.
그 부분은 새로운 뷰 만들기에서 다시 얘기하도록 하겠다.
그리고 또 알아봐야 할 함수는 canvas.save(), canvas.restore() 함수이다.
캔버스 객체는 마치 포토샾의 레이어 처럼 하나씩 사본은 저장해 놓고 다 그린 다음에 레이어를 합성하여 그려낸다.
save() 는 레이어를 저장하는 함수이고, restore() 는 합성하는 역할을 한다.
이 함수들은 항상 짝을 지어 호출되어야 한다. 즉, save() 를 하면 반드시 restore() 함수를 호출해줘야 한다.
위에서는 save() 함수를 호출하여 레이어를 만들고 좌측으로 이동하여 TextView의 기본렌더링을 한 후에estore()를 호출하여 합성을 했다.
좌측으로 이동한 이유는 빨간선 다음으로 할일 텍스트가 그려져야 하기 때문이다.
그럼 restore() 하기전에 super.onDraw()는 왜 호출해 줬는지 궁금할 것이다.
그런 텍스트뷰의 기본 렌더링기능 즉, 텍스트 출력을 위해서다.
다른 모양을 위해서 재정의 하는것을 어플을 만드는데 유용하게 사용될 것 같다.
'개발관련 > Android' 카테고리의 다른 글
| WebView 웹 브라우저 컴포넌트 사용하기 (0) | 2010/10/06 |
|---|---|
| 사용자 뷰 만들기 - 새로운 뷰 만들기 (0) | 2010/09/05 |
| 사용자 뷰 만들기 - 기존뷰 재정의하기 (0) | 2010/09/03 |
| Intent - 액티비티간 데이터 받기 (0) | 2010/09/01 |
| Intent - 암시적인 인텐트 호출 (0) | 2010/09/01 |
| Intent - 명시적인 인텐트 호출 (0) | 2010/09/01 |



댓글을 달아 주세요