상세 컨텐츠

본문 제목

[android]뷰의 화면 출력 과정

Android 개발

by mobile 2013. 3. 9. 23:47

본문

반응형

- 뷰의 화면 출력 과정

자바 프로그램에서 setContentView() 메서드를 호출하면, XML 요소는 인스턴스화 되고 출력을 준비하게 된다. 안드로이드 setContentView() 메서드를 호출했다 하더라도 그 즉시 화면에 출력하는 것이 아니라 다른 작업이 완료된 이후 화면에 출력된다.


자바 프로그램에서 뷰의 자료나 이미지를 입력할 수 있기 때문에 뷰의 크기란 언제든지 변화되는 가변적이라는 이야기다.


안드로이드는 뷰의 가변적인 크기에 맞추어 뷰의 위치와 크기를 지정하기 위해 아래와 같은 단계로 작업하게 된다.


먼저 측정단계(measure pass)라 하여 XML 문서의 상속 요건에 따라 상위 레이아웃이나 뷰로 부터 시작하여 하위 레이아웃(또는 뷰)로 내려가면서 계산하게 된다. 그리고 하위 뷰까지 계산이 완료되면 반복적으로 계산하여 확인한다.


두 번째 레이아웃 단계(layout pass)라 하여 상위 레이아웃(또는 뷰)으로 부터 하위 레이아웃(또는 뷰)까지 실제 값들을 부여한다.


public class MainActivity extends Activity {


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

makeView();

}


private void makeView() {

this.setTitle(R.string.density_title);

// 선형 레이아웃을 만든다.

LinearLayout root = new LinearLayout(this);

root.setOrientation(LinearLayout.VERTICAL);

root.setGravity(Gravity.CENTER);

root.setLayoutParams(new LinearLayout.LayoutParams(

LinearLayout.LayoutParams.MATCH_PARENT,

LinearLayout.LayoutParams.MATCH_PARENT));

// 리소스에서 비트맵 모형을 읽어 Bitmap 객체를 만든다.

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),

R.drawable.ic_launcher);

ScaledBitmapView view = new ScaledBitmapView(this, bitmap);


view.setLayoutParams(new LinearLayout.LayoutParams(

LinearLayout.LayoutParams.WRAP_CONTENT,

LinearLayout.LayoutParams.WRAP_CONTENT));

root.addView(view);

setContentView(root);

}


private class ScaledBitmapView extends View {


private final Bitmap mBitmap;


public ScaledBitmapView(Context context, Bitmap bitmap) {

super(context);

mBitmap = bitmap;

}


@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// TODO Auto-generated method stub

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

final DisplayMetrics metrics = getResources().getDisplayMetrics();

setMeasuredDimension(mBitmap.getScaledWidth(metrics),

mBitmap.getScaledHeight(metrics));

}

@Override

protected void onDraw(Canvas canvas) {

// TODO Auto-generated method stub

super.onDraw(canvas);

canvas.drawBitmap(mBitmap, 0.0f, 0.0f, null);

}

}

}


▶ View 클래스에서 제공되는 콜백 메서드

- 생성

1) 생성자 

: 뷰의 인스턴스를 생성한다. 일반적으로 XML 레이아웃은 setContentView() 메서드로부터 생성된다.

onFinishInflate()

: XML 문서를 인플레이션한 이후 종료할 때 호출된다.


- 레이아웃

1) onMeasure(int, int)

: 뷰그룹이나 뷰의 크기와 위치를 계산할 때 호출된다.

2) onLayout(boolean, int, int, int, int)

: 이 콜백 메서드는 뷰그룹에서 하위 뷰들에 대해 크기와 위치를 할당 할 때 호출된다.

3) onsizeChanged(int, int, int, int)

: 뷰의 크기가 변경되었을때 호출된다.


- 그리기

1) onDraw(Canvas)

: 개별적인 뷰를 그릴 때 호출된다.


- 이벤트

1) onKeyDown(int, KeyEvent)

: 터치화면에서 키다운 이벤트 핸들러의 콜백 메서드이다.

2) onKeyUp(int, KeyEvent)

: 터치화면에서 키업 이벤트 핸들러의 콜백 메서드이다.

3) onTrackballEvent(MotionEvent)

: 트랙볼 이벤트 핸들러의 콜백 메서드이다.

4) onTouchEvent(MotionEvent)

: 터치화면 이벤트 핸들러의 콜백 메서드이다.


- 포커스 

1) onFocusChanged(boolean, int Rect)

: 뷰의 포커스를 얻거나 잃을 때 호출된다.

2) onWindowFocusChanged(boolean)

: 화면의 포커스를 얻거나 잃을 때 호출된다.


- 기타

1) onAttachedToWindow()

: 화면에 뷰가 추가될 때 호출된다.

2) onDetachedFromWindow()

: 화면에 뷰가 제거될 때 호출된다.

3) onWindowVisibilityChanged(int)

: 화면에 뷰가 보여지거나 숨겨질 때 호출된다.


반응형

관련글 더보기

댓글 영역