SurfaceView는 저도 공부를 하다가 처음알게된 View입니다.
먼저, SurfaceView를 사용하는 이유는 여러 이미지를 갱신하여야 할때 혹은 많은 자원을 사용하여야 할경우 화면이 깨지거나 렉이 걸리는등을 쉽게 해결해줄수 있기 때문에 사용합니다.
개념은 인터넷에 잘 설명해신 분들이 많아서 그걸 인용해왔습니다.
'Android Application에서 View는 GDI Thread를 통해 Surface에 그려지게 됩니다. 만약 View에 동영상 또는 카메라 프리뷰와 같이 그려지는 양이 매우 많거나 빠른 화면 변화를 원한다면 SurfaceView를 사용해야 합니다. SurfaceView의 내용은 GDI Thread를 통해서 Surface에 그려지지 않고 다른 Thread를 통해서 그려지기 때문입니다. SurfaceView는 아래 그림과 같이 Window의 아래쪽에 위치하며, Windows를 뚫어서(Punched) 자신이 보여지게끔 합니다. 단, 해당 Window 위에 다른 View가 있는 경우 블렌딩(blended)이 되어 보여지게 됩니다.'
[출처] 청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법 http://sozu.tistory.com/35
이해가 가시나요? SurfaceView의 핵심적인 요소를 그림을 곁들여 아주 간결하게 설명한 글이라고 생각됩니다. 조금 더 부연 설명을 하자면, 위에서 GDI라는 말이 나오는데 Graphic Device Interface의 약자로 그래픽을 기반으로 하는 사용자 인터페이스를 의미하는 용어입니다. 요즈음은 DOS처럼 텍스트를 기반으로 하는 인터페이스는 거의 사용하지 않기 때문에 그냥 UI(User Interface)라고만 해도 그건 GDI를 의미한다고 생각하셔도 됩니다. 컴퓨터를 보던지, 폰을 보던지 모두 그래픽 환경에 아이콘을 기본으로 하고 있으니까요.
Surface는 하나의 그래픽 버퍼로써 SurfaceView에 실제로 그림을 그리는 등의 작업을 하는 것은 SurfaceHolder라고 하는 콜백(Callback) 함수 입니다. 콜백 함수는 정의해 두기만 하면 사용자가 직접 호출하지 않더라도 운영체제가 알아서 호출해 주는 함수를 의미하는 용어입니다. 지난 강좌에 사용한 Touch나 KeyDown 이벤트 핸들러, 앞으로 만들어 갈 메뉴 등이 모두 콜백함수입니다.
인터넷에 SurfaceView와 SurfaceHolder의 관계를 그림으로 잘 표현한 것이 있어 그것도 인용하도록 하겠습니다.
[출처] 커니의 안드로이드 이야기 http://androidhuman.tistory.com/307
위의 그림과 같이 SurfaceHolder를 이용해서 Surface라는 버퍼에 그림을 그리면 그것이 SurfaceView에 반영이 되고 그 결과가 사용자의 View에 표시되는 방식입니다. 전문적인 용어로는 더블 버퍼링이라고 하죠. 더블 버퍼링은 이미지 등을 (처리 속도가 느린) View에 직접 그리는 것이 아니라, (처리 속도가 빠른) 메모리에서 처리한 다음 (복사하듯이) 메모리에서 View로 고속 전송을 하는 개념입니다.
출처 : http://javaexpert.tistory.com/170 [나는 안드로이드다.]