급하게 앱을 만들려고 하다보니,

블로그나 StackOverFlow등에서 필요한 부분만 참조해서 개발하다 보면,

큰 그림을 놓치게 되는 경우가 많은데요.

앱이라는 것이 사용자에게 화면을 그려서 인터랙션하는 것이므로,

이 View와 관련된 View, Canvas, Surface 그리고 Window에 대한 이해가 높으면,

아무래도 작업을 하는데 더욱 좋을 것 같습니다.

그럼 하나씩 알아보도록 하겠습니다.

 

1. View, Canvas, Surface 그리고 Window

이들의 HierArchy는 어떻게 될 까요?

순서는 위에서 적은 반대로 되어 있습니다.

즉, Window > Surface > Canvas > View 가 안에 포함된다고 할 수 있는데요.

주의할 점은 이들이 상속관계에 있다는 것은 아니라는 점 입니다.

 

그런데 왜 이렇게 많은 클래스들이 필요한 것 일까요?

하나씩 알아보도록 하겠습니다.

 

1. Window

window객체는 언제 써 보았는지 기억하시나요?

대부분 아래와 같이 statusBar같은 곳을 컨트롤 하기위해서 불러와서 설정해 사용하셨을 것 입니다.

window는 시스템의 WindowManager에 top-level View로 더해 지는데요.

background, title영역 등 UI의 기본이 되는 부분들에 대해서 컨트롤 할 수 있게 해 줍니다.

 

 

 

2. Surface

Surface에 대한 공식문서의 설명은 좀 어려운 편인데요.

Screen Compositor에 의해 관리되는 raw buffer를 핸들링 하는 것이 역할 이라고 하는데요.

조금 어려우니 어디서 사용하는지 생각해 보기로 하지요.

가장 와 닿는 부분은 Camera사용시에 많이 사용하게 되는 것 이지요.

또한 Game의 OpenGL에서도 사용되어 진다고 합니다.

 

 

3. Canvas

무언가를 그릴 때는 4가지 컴포넌트가 필요합니다.

픽셀을 가지고 있는 Bitmap, Path같은 Drawing Primitive, 그리고 컬러나 스타일을 정의할 Paint객체,

마지막으로 중요한 draw call을 host하는 Canvas입니다.

클래스 이름이 Canvas인 것도 이와 관련이 있을 것 같습니다.

 

아래와 같이 해서, Circle을 그릴 수 있습니다.

 

 

예전에는  화면을 캡처하기 위해서, view를 쓰기도 했었는데요.

이제는 Canvas를 이용해서 View를 캡처하기도 합니다.

 

4. View

안드로이드의 View는 사각형 형태로 화면을 차지하고,

drawing과 이벤트를 핸들링 해주는 클래스입니다.

 

5. SurfaceView

여기서 한가지 흥미로운 클래스가 등장합니다.

SurfaceView인데요.

Surface와 View의 합성이라는 뜻은 아니구요.

안드로이드의 View가 메인쓰레드에서만 그릴 수 있는 한계를 벗어나,

Canvas가 아닌 Surface에 그린다음,

그것을 View뿌리기 때문에 그래픽이 중요한

게임같은 곳에서 중요한 역할을 할 수 있습니다.

 

 

 

 

그런데 오늘은 View보다

728x90

+ Recent posts