본문 바로가기
프로그래밍/Android

Android SurfaceView

by Daniel.kwak 2018. 12. 4.

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)



Surface가 Destroy되는 순간 호출된다. surfaceDestroyed가 호출된 이후에는 더 이상 surface에 접근해서는 안된다. 만약 surface에 바로 접근하여 그리는 렌더링 쓰레드가 있다면, 이 함수의 리턴을 받기 전에는 더 이상 surface를 건드릴 수 없다. 


3.surfaceChanged

surfaceChanged는 surface의 구조적인 변화(포맷이나 사이즈)가 생기면 호출된다. 이 시점에서 surface 안의 image를 변경할 수 있다. surfaceCreated가 호출된 이후로 최소 한 번은 불린다.


다음은 안드로이드 카메라 객체에서 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