[android]ImageView 클래스 분석하기

SMART_Phone/Android 2011. 5. 30. 18:40 Posted by Request
ImageView 클래스는 상위 클래스 SurfaceView 클래스 상속받으며
SurfaceHolder.Callback 인터페이스 구현

 public class ImageView extends SurfacefView implements SurfaceHolder.Callback{....}

표면(surface)에 그리기 위해 Canvas클래스를 가지고 있으며, 레이어와 표면을 리사이즈하기 위한 다양한 메소드들을 제공한다.

프로그래머는 Surface 클래스에 직접 사용 할수 없고, SurfaceVIew 클래스를 이용하여 표면에 접근할수 있다.

Canvas클래스그림을 그리기 위한 도구.(표준 메소드, bitmap, line, circle, rectangles, text등)
SurfaceHolder는 일종의 중간자적인 역할을 하는 인터페이스로

SurfaceView가 Surface에 접근할때 SurfaceHolder를 경유
SurfaceHolder는 SurfaceHolder.Callback 인터페이스 포함하여 표면이 변경되는 등의 변화에 대한 이벤트받고 싶다면 SurfaceHolder.Callback로 사용하면 됨.

[발생 되는 이벤트]
surfaceCreated
:surface를 생성한 후 호출

surfaceChanged
:surface가 변경되었을 경우에 호출

surfaceDestroyed
:Surface가 제거 될 때 호출. 이 메소드에서 리소스 해제 작업을 수행


[2.SurfaceHolder.lockCanvas()와 SurfaceHolder.UnlockCanvasANdPost(Canvas c)의 이해]
lockCanvas()를 통해 얻은 Canvas를 이용하여 그림을 그리는 것은 백버퍼에서 그리는 것으로 화면에 표시 하지 않는다.
unlockCanvasAndPost()메소드가 실행되어야 비로소 작성한 이미지가 화면에 표현됨.


 SurfaceHolder 구하기

(1) ImageView 에서 다음과 같이 실행하여 SurfacefaceHolder를 구한다.
 Canvas mCanvas = null;
SurfaceHolder mHolder =getHolder();

(2)ImageView 클래스의 생성자에서 다음을 실행하여 콜백을 가능하도록 한다.
 mHolder.addCallback(this);

(3)표면이 생성될때 surfaceCreated()메소드 호출된다.
try{
 mCanvas = mHolder.lockCanvas(null);
draw(mCanvas);
}finally{
if(mCanvas != null){
 mHolder.unlockCanvasAndPost(mCanvas);
}


(4)draw()메소드에서 Canvas를 이용해서 이미지를 그린다.
 canvas.drawBitmap(mImgBack0, 0, 0, null);