[CustomView] 0. RobotView 생성

|
#CustomView 만들기

View(Context context, AttributeSet attrs) {}
1. 안드로이드 OS의 현재 상태 정보를 관리하는 클래스
2. 속성 배열

java.lang.Object
ㄴandroid.content.Context

java.lang.Object
ㄴandroid.content.Context
  ㄴandroid.content.ContextWrapper
    ㄴandroid.view.ContextThemeWrapper
      ㄴandroid.app.Activity

Context는 OS입장에서 실행 중인 application을 관리하기 위한 자료구조라고 보시면 될 것 같습니다. 
Class를 생성할 때 또는 정보를 얻고자 할때 context가 parameter로 많이 사용이 되는데 
이는 Class memory를 할당하거나 정보를 얻고자 하는 memory block 정보를 검색하기 위해서 
어떠한 application에서 요청했는지가 필요하기 때문입니다. 

예를들어서 TextView를 생성하는 경우 내부적으로는 heap memory를 할당하고 
해당 memory pointer를 Application context 정보를 기반으로 관리하는 것이고 
Application이 종료하게 되면 해당 application이 사용하는 heap memory를 free하는데 사용합니다. 

AttributeSet은 일반적으로 layout xml에서 android:text="@string/hello"와 같이 설정을 하는데 
LayoutInflater class를 사용해서 TextView를 실시간으로 생성하게 되는 경우 
TextView의 속성을 지정할 때 사용하는 class입니다. 

AttributeSet은 SDK를 보시면 아시겠지만 XML에 기반한 class입니다.


[개요]
1. MyView Class 추가
SuperClass : android.view.View 선택
2. MyView(Context context, AttributeSet attrs) 생성자 추가
View 클래스는 반드시 생성자를 필요로 한다.
x 클릭 > 2번째 생성자 선택
3. 우클릭 > Source > Override 선택 (Alt + Shift + S > v)
onDraw() 선택
위치 지정
4. 그림 정보를 담을 image 변수 생성
private Drawable image; (자동 임포트 : Ctrl + Shift + O)
생성자 안의 super() 아래에서 image에 그림의 아이디를 할당 (R.java에 모든 리소스들이 자동 생성됨)
5. onDraw() 안의 super() 위에서 image 위치 지정 및 그리기
6. main.xml에 태그 삽입
@+id/myview_id : 새로운 아이디 생성하여 사용
@id/myview_id : 기존 아이디 사용
직접 생선한 클래스이므로 디자이너에는 없다. 따라서 직접 xml 코드를 작성해 주어야 한다.
특정 동작을 하는 애니메이션 같은 경우에 커스텀 뷰를 만들어 사용한다.

[RobotView.java]
package net.itisn.test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;

public class RobotView extends View {

    private Drawable image;

    public RobotView(Context context, AttributeSet attrs) {
    	super(context, attrs);
    	// TODO Auto-generated constructor stub
    	image = this.getResources().getDrawable(R.drawable.su);
    }

    @Override
    protected void onDraw(Canvas canvas) {
    	// TODO Auto-generated method stub
    	image.setBounds(0, 0, 128, 128);
    	image.draw(canvas);
    	//layout(0, 0, 128, 128);

    	super.onDraw(canvas);
    }
}

[main.xml]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />

<net.itisn.test.MyView android:id="@+id/su"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
<net.itisn.test.SunView
    android:id="@+id/icon"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    />

</LinearLayout>

And