달력

12

« 2019/12 »

  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
  •  
  •  

'SurfaceHolder'에 해당되는 글 1

  1. SurfaceView(서피스뷰)

   

SurfaceView(서피스뷰)

  • 안드로이드는 OpenGL ES라이버리를 포함하고 있어 3D를 지원할 수있습니다.
  • 애플리케이션에서 3D 객체를 출력하려면 SurfaceView를 이용해야 합니다. 하드웨어 가속 기능이 있어 그래픽을 보다 빠르게 처리할 수 있습니다.
  • Surfaceview는 안드로이드의 기본 뷰 체계와 다르게 구현되어 있어 뷰를 상속하여 그래픽을 구현한 방법을 그대로 사용할 수 없습니다. 그러므로 SurfaceView를 이용한 그래픽 그리기 방법을 별도로 따라야 합니다.
  • 안드로이드의 기본 뷰 에 포함되어 있지 않기 때문에 onDraw()와 isvalidate()메소드를 사용할 수 없으며 이를 대체할 수 있는 메소드를 직접 구현해야 합니다.
  • SurfaceView는 2D그래픽도 그대로 지원합니다.
  • 카메라에서 영상을 빠르게 보여주기 위해서 광범위하게 사용됩니다.

   

   

   

   

이벤트 처리

Callback Interface는 SurfaceHolder를 통해서 작성한 Surface와 SurfaceView를 연결하기 위해서 Surface의 생성, 변경, 종료에 대한 이벤트 처리합니다.

class MyCameraSurface extends SurfaceView implements SurfaceHolder.Callback{ }

   

   

SurfaceView를 이용한 그래픽 그리기 단계

1

SurfaceView 상속하면서 Callback인터페이스 구현

2

getHolder()메소드로 SurfaceHolder객체 참조

3

SurfaceHolder객체의 addCallback()메소드를 호출하여 Callback인터페이스 설정

4

Callback 인터페이스의 surfaceCreated()메소드 재정의

5

Callback 인터페이스의 surfaceChanged()메소드 재정의

6

Callback 인터페이스의 surfaceDestroyed()메소드 재정의

   

   

Lock 잠금 기능

SurfaceView가 그래픽 작업을 할때 시스템이나 다른 어플리케이션에서 접근할 수 없도록 막는 기능을 사용합니다. (SurfaceView의 크기 변동과 동시에 그래픽을 그릴 경우 데드락이 발생합니다)

   

private void myDraw(){

Canvas _canvas = null;

   

try{

_canvas = mHolder.lockCanvas(null);

   

//객체 그리기 작업

super.draw(_canvas);

_cansvs.drawBitmap(mBitmap, 0, 0, null);

}finally{

if(_canvas!=null){

mHolder.unlockCanvasAndPost(_canvas);

}

}

}

  

   

   

SurfaceView 동작 도식도

   

   

   

SurfaceView 클래스

화면 제공

단순히 화면에 보여지는 하나의 뷰를 정의

Surface

그래픽버퍼 (데이터 제공)

SurfaceHolder 인터페이스

화면 제어

SurfaceView를 내부적으로 제어

SurfaceHolder.Callback 인터페이스

SurfaceView의 크기 변화등 상태 정보를 관리합니다.

Surface의 생성, 변경, 종료에 대한 이벤트 처리를 수행합니다.

SurfaceView에서 보여지는 화면 제어를 하기 위해서 SurfaceHolder생성하고

SurfaceHolder를 이용해서 Surface(버퍼)에 그림을 그리면 SurfaceView에 반영됩니다.

Posted by codedragon codedragon

댓글을 달아 주세요