IT박스

캔버스 및 표면 개념 이해

itboxs 2020. 7. 28. 08:17
반응형

캔버스 및 표면 개념 이해


Android에서 사용되는 SurfaceView전체 Surface/ Canvas/ Bitmap시스템 으로 그리는 프로세스를 이해하는 데 어려움을 겪고 있습니다.

나는 안드로이드 개발자 사이트, 안드로이드 그래픽에 대한 몇 가지 자습서, LunarLander 소스 코드 및 이 질문 에서 찾을 수있는 모든 기사와 API 문서 페이지를 읽었습니다 .

이 중 어느 것이 사실인지, 왜 그렇지 않은지 말해주십시오.

  1. Canvas자체 Bitmap첨부되어 있습니다. Surface자체 Canvas첨부되어 있습니다.
  2. 모든 View창은 동일 Surface하므로 공유합니다 Canvas.
  3. SurfaceView의 서브 클래스에서 View다른 달리하는, View의 서브 클래스 및 View자체 자체가 Surface에 그릴을.

추가 질문도 있습니다.

  • 비트 맵을 사용한 고급 작업 Surface이 이미 필요한 경우 클래스 가 필요한 이유는 무엇입니까? 할 수 있는 일을하기에 적합하지 않은 Canvas상황의 예를 들어보십시오 .CanvasSurface

다음은 몇 가지 정의입니다.

  • Surface는 화면에 합성되는 픽셀을 보유한 객체입니다. 화면에 표시되는 모든 창 (대화 상자, 전체 화면 활동, 상태 표시 줄)에는 자체 표면이 그려져 있으며 Surface Flinger는이를 올바른 Z 순서로 최종 디스플레이에 렌더링합니다. 표면에는 일반적으로 이중 버퍼 렌더링을 수행하기 위해 둘 이상의 버퍼 (일반적으로 2 개)가 있습니다. 표면 플 링거가 마지막 버퍼를 사용하여 화면을 합성하는 동안 응용 프로그램은 다음 UI 상태를 그릴 수 있습니다. 그림.

  • 창은 기본적으로 데스크탑의 창을 생각하는 것과 같습니다. 창의 내용이 렌더링되는 단일 Surface가 있습니다. 응용 프로그램은 창 관리자와 상호 작용하여 창을 만듭니다. 창 관리자는 각 창에 대한 표면을 작성하여 그리기 위해 응용 프로그램에 제공합니다. 응용 프로그램은 Surface에서 원하는 것을 그릴 수 있습니다. 창 관리자에게는 불투명 한 사각형 일뿐입니다.

  • 보기는 창 내부의 대화식 UI 요소입니다. 창에는 단일 뷰 계층 구조가 연결되어 있으며 창의 모든 동작을 제공합니다. 창을 다시 그릴 필요가있을 때마다 (예 : 뷰 자체가 무효화 되었기 때문에)이 작업은 창의 표면에서 수행됩니다. 표면이 잠기면 캔버스를 그리는 데 사용할 수있는 캔버스가 반환됩니다. Draw traversal은 계층 구조에서 이루어지며 각 뷰에 대해 Canvas를 전달하여 UI의 일부를 그립니다. 완료되면 Surface의 잠금이 해제되고 게시되어 방금 그린 버퍼가 포 그라운드로 바뀌고 Surface Flinger에 의해 화면에 합성됩니다.

  • SurfaceView는 응용 프로그램이 직접 그릴 수있는 자체 전용 Surface를 만드는 View의 특수 구현입니다 (일반 뷰 계층 외부에서 그렇지 않으면 창에 대해 단일 Surface를 공유해야 함). 이것이 작동하는 방식은 예상보다 간단합니다. 모든 SurfaceView는 창 관리자에게 새 창을 만들도록 요청하여 SurfaceView의 창 바로 뒤 또는 앞의 창을 Z 순서로 알려주고 일치하도록 배치합니다. 여기서 SurfaceView가 포함 창에 나타납니다. 표면이 주 창 뒤에 배치되는 경우 (Z 순서) SurfaceView는 주 창의 일부를 투명도로 채워서 표면을 볼 수 있습니다.

  • 비트 맵은 일부 픽셀 데이터에 대한 인터페이스 일뿐입니다. 픽셀을 직접 만들 때 비트 맵 자체에 의해 픽셀이 할당되거나, 그리기 위해 Canvas를 Surface에 연결하기 위해 내부적으로 발생하는 것과 같이 자신이 소유하지 않은 픽셀을 가리키는 것일 수 있습니다. 비트 맵이 만들어져 Surface의 현재 그리기 버퍼를 가리 킵니다.

또한 이것이 의미하는 것처럼 SurfaceView는 매우 무거운 객체입니다. 특정 UI에 여러 SurfaceView가있는 경우 중지하고 이것이 실제로 필요한지 생각해보십시오. 둘 이상인 경우, 거의 확실하게 너무 많습니다.


창, 표면, 캔버스 및 비트 맵의 ​​개념적 개요

Here is a very basic and simple conceptual overview of how interaction happens among the Window, Surface, Canvas, and Bitmap.
Sometimes, a visual representation helps a lot in understanding twisted concepts.
I hope this graphic could help someone.


A Bitmap is simply a wrapper for a collection of pixels. Think of it as an array of pixels with some other convenient functions.

The Canvas is simply the class that contains all the drawing methods. It is similar to the Graphics class in AWT/Swing if you are familiar with that. All the logic on how to draw a circle, or a box, etc is contained inside Canvas. A canvas draws on a Bitmap or an open GL container but there is no reason why in the future it could be extended to draw onto other types of rasters.

SurfaceView is a View that contains a Surface. A surface is similar to a bitmap (it has a pixel store). I do not know how it is implemented but I'd imagine it is a some kind of Bitmap wrapper with extra methods for things that are directly related to screen displays (That is the reason for a surface, a Bitmap is too generic). You can get a Canvas from your Surface which is really getting the Canvas associated with the underlying Bitmap.

Your questions.

1.Canvas has its own Bitmap attached to it. Surface has its own Canvas attached to it.

Yes, a canvas operates on a Bitmap (or an open GL panel). Surface gives you a Canvas that is operating on whatever Surface is using for its Bitmap style pixel store.

2.All View's of window share the same Surface and thus share the same Canvas.

No. You could have as many surface views as you want.

3. SurfaceView는 View의 서브 클래스로 다른 View의 서브 클래스 및 View 자체와 달리 자체 Surface를 사용합니다.

예. ListView와 마찬가지로 자체 List 데이터 구조를 가진 View의 하위 클래스처럼. View의 각 하위 클래스는 다른 기능을 수행합니다.

참고 URL : https://stackoverflow.com/questions/4576909/understanding-canvas-and-surface-concepts

반응형