SurfaceView란?
SufaceView라는 이름에서 알 수 있듯이 Textview나 ImageView처럼 내용을 표시할 수 있는 View이다. SurfaceView에서 직접 내용을 뿌려주지는 않고, SurfaceHolder를 통해 데이터를 받아서 처리한다.
Android Thread편에서 알 수 있듯이 안드로이드의 모든 컴포넌트에서 동작하는 행위들은(View처리) Android의 UI 쓰레드에서 동작한다.
그러나 Camera Preview나, 동영상 재생 같은 처리들은 1초에 몇 십 프레임을 출력해야하는 제법 무거운 작업들이고 Android UI 혼자 감당하기에는 자원이 부족, 이는 곧 치명적인 ANR이 발생하는 원인이 된다.
SurfaceView는 UI 쓰레드와는 별도로 백그라운드 쓰레드에서 동작하여 사용자가 원하는 뷰를 원할하게 업데이트를 해준다. 뿐만 아니라 openGL을 사용하여 가속도 지원되기 때문에 3D 출력도 가능하다.
SurfaceView 구조
위 그림처럼 SurfaceHolder와 surface가 계속 통신하면서 SurfaceHolder가 Surface에 접근하여 화면을 처리해주는 구조이다.
SurfaceView를 사용하기 위해서는 SurfaceView 상속받고 Surface.Callback을 구현(implements)하여 클래스를 생성해야 한다. 코드를 살펴보자.
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
public MySurfaceView(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
1.첫번째로 클래스의 멤버 변수로 SufaceHolder 객체를 가지고 있다. SurfaceView를 상속받았으므로 getHolder() 메소드를 통해 현재 SurfaceView에 해당하는 Holder를 얻어올 수 있다. mHolder를 통해 실제 콘텐츠가 표시되는 영역인 Surface를 관리하고 데이터를 처리할 수 있다.
2.두번째는 mHolder의 콜백을 자신의 SurfaceView의 callback을 구현한 자신을 넘겨줬다는 것. 이를 통해 surface에서 발생하는 작업을 surfaceHolder를 거쳐서 SurfaceView의 콜백에서 처리할 수 있게 된다.
SurfaceView의 override함수들
1.SurfaceCreated(SurfaceHolder holder)
Surface가 처음 생성될때 호출되는 함수이다. Surface에 렌더링 하려는 코드를 여기에서 시작해야 한다. 단 하나의 쓰레드 만이 Surface를 그릴 수 있으므로 다른 쓰레드에 접근하여 그리는 시도를 해서는 안된다.
2.SurfaceDestroyed(SurfaceHolder holder)
다음은 안드로이드 카메라 객체에서 SurfaceView를 통해 영상을 뿌려주는 부분을 살펴보자.
출처:커니의 안드로이드 블로그
'프로그래밍 > Android' 카테고리의 다른 글
안드로이드 방향 전환 (0) | 2018.12.06 |
---|---|
안드로이드 컴포넌트 (0) | 2018.12.06 |
안드로이드 AlaramManager (0) | 2018.12.05 |
Android Material CalendarView (1) | 2018.12.05 |
안드로이드 Camera의 영상 출력하기 (0) | 2018.12.05 |
안드로이드 쓰레드(1) (0) | 2018.11.12 |