View/SurfaceView2010.03.11 15:15

서페이스는 주로 카메라나 비디오 사용시 미리보기 화면을 쓰기 위해 사용 가능 합니다.

SufraceView라는 이름에서 알 수 있듯이, TextView, ImageView처럼 content를 표시할 수 있는 View 중 하나입니다. 하지만 이 SurfaceView는 다른 View들과는 달리 직접 Surface Viewcontent를 표시하지 않습니다.


일반적인 View는 화면에 view를 표시하는 연산과 기타 연산, 사용자와의 상호작용 처리 등이 모두 하나의 thread에서 처리됩니다.  이것을 가장 잘 확인할 수 있는 예가 바로 ANR(Application Not Responding)입니다. ANR은 어플리케이션이 5초 이상 동작을 멈췄을 때, 조금 더 자세히 말하자면 GUI 업데이트가 5초 이상 멈췄을 때 발생하는데, 실제로 가끔씩 몇몇 어플리케이션에서 연산이 늦어지면 GUI 업데이트가 늦어지며 ANR이 발생 하는 것을 볼 수 있습니다.

 

, GUI 업데이트와 다른 연산이 같은 thread 내에서 처리되기에 이런 현상이 발생 하게 됩니다.

 

그런데, 처리 해야 할 것은 카메라 프리뷰, 즉 실시간으로 화상을 카메라로부터 받아서 1초에 몇 십 프레임 이상의 속도로 화면을 업데이트해야 하는 동작입니다. 그렇기에 만약 SurfaceView를 쓰지 않으면 view를 업데이트하는데 thread의 자원을 모두 써서 어플리 케이션의 정상적인 동작을 보장하기 어렵게 됩니다.

 

그래서 등장한 것이 바로 SurfaceView입니다. SurfaceView는 화면 업데이트를 백그라운드 thread로 수행하여 어플리케이션의 자원을 잠식하지 않고 원활하게 view을 업데이트 해 줍니다. 뿐만 아니라 SurfaceView OpenGL을 통한 가속이 지원되어 원활한 3D그래픽 표현도 가능합니다. (GLSurfaceView)



그럼 실제로 소스로 적용하려면 어떤 방향으로 진행해야 할까요

 

권한 주기

<uses-permission android:name="android.permission.CAMERA"></uses-permission>

<uses-feature android:name="android.hardware.camera" />

<uses-feature android:name="android.hardware.camera.autofocus" />

 주요 클래스

class Preview extends SurfaceView implements SurfaceHolder.Callback {

public Preview(Context context, AttributeSet attrs) { }

public void surfaceCreated(SurfaceHolder holder) {}

public void surfaceDestroyed(SurfaceHolder holder) {}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {}

}


이런 주요 함수를 통해서 구조를 잡아야 하는데요

그럼 세부적으로 보면 

세부 구성

class Preview extends SurfaceView implements SurfaceHolder.Callback {

 SurfaceHolder mHolder;

 Camera mCamera = null;

public Preview(Context context, AttributeSet attrs) {

super(context, attrs);

InitRunMode(context);       

mHolder = getHolder();

mHolder.addCallback(this);

mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

 }

public void surfaceCreated(SurfaceHolder holder) {}

public void surfaceDestroyed(SurfaceHolder holder) {}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {}

}

 

public void surfaceCreated(SurfaceHolder holder)

{

mCamera = Camera.open();

try {

mCamera.setPreviewDisplay(holder);

}

catch (IOException exception) {

mCamera.release();

mCamera = null;

}

}

}


 

public void surfaceDestroyed(SurfaceHolder holder)

   {

mCamera.stopPreview();

mCamera.release();     

mCamera = null;

}

 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)

{

  Camera.Parameters parameters = mCamera.getParameters();

       parameters.setPreviewSize(w, h);

       mCamera.setParameters(parameters);

       mCamera.startPreview();

}

이런식으로 진행해야 합니다. 어차피 오픈소스를 통해서 프리뷰를 이해할 수있겠지만

어떤 방향으로 진행 해야 한다는 기본 틀을 알고 시작해야 덜 어렵지 않을까요.

저작자 표시
신고

'View > SurfaceView' 카테고리의 다른 글

surfaceView본문에 적용  (0) 2010.03.11
surfaceView  (0) 2010.03.11
Posted by 규혁님 (주)vissel

티스토리 툴바