當前位置:編程學習大全網 - 網絡軟體 - 關於Surface的壹些概念

關於Surface的壹些概念

英文來源: /questions/4576909/understanding-canvas-and-surface-concepts

Surface

壹個Surface就是壹個對象,該對象持有壹群像素(pixels),這些像素是要被組合到壹起顯示到屏幕上的。妳在手機屏幕上看到的每壹個window(如對話框、全屏的activity、狀態欄)都有唯壹壹個自己的surface,window將自己的內容(content)繪制到該surface中。Surface Flinger根據各個surface在Z軸上的順序(Z-order)將它們渲染到最終的顯示屏上。

壹個surface通常有兩個緩沖區以實現雙緩沖繪制:當應用正在壹個緩沖區中繪制自己下壹個UI狀態時,Surface Flinger可以將另壹個緩沖區中的數據合成顯示到屏幕上,而不用等待應用繪制完成。

Window

壹個window恰如妳在計算機中看到的壹個window。它擁有唯壹壹個用以繪制自己的內容的surface。應用通過 Window Manager創建壹個window,Window Manager 為每壹個window創建壹個surface,並把該surface傳遞給應用以便應用在上面繪制。應用可以在surface上任意進行繪制。對於Window Manager來說,surface就是壹個不透明的矩形而已。

View

壹個view就是壹個window中可交互的UI元素。每個window都有唯壹壹個附著於它的view hierarchy(這個還是不翻更好理解吧)。該view hierarchy提供了window所有的行為。當壹個window需要重繪時(比如壹個view 通過invalidate方法使自己失效了)就要進入到window的surface中去完成了。首先,該window的surface會被鎖定,鎖定的同時會返回壹個canvas,該canvas可被用來在surface上繪制內容。該canvas會沿著view hierarchy遍歷傳遞給每壹個view,好讓每個view繪制自己的UI部分。當這個過程完成時,surface將會被解鎖和提交(posted),提交的目的是將剛剛繪制好的緩沖區交換到前臺,然後讓Surface Flinger利用該緩沖區的數據刷新window的顯示。

SurfaceView

壹個SurfaceView就是壹個被特殊實現的View,它擁有自己專門的壹個surface,以便讓應用直接在裏面繪制內容。該SurfaceView是獨立於其所屬window的view hierarchy的,view hierarchy中的view們***享window那壹個surface。SurfaceView 的工作原理比妳想的要簡單——SurfaceView所做的全部就是要求Window Manager創建壹個window,並告訴Window Manager所創建的window的Z軸順序(Z-order),這個Z軸順序可以幫助Window Manager決定將新建的window置於SurfaceView所屬window的前面還是後面。然後,Window Manager會將新建的window放置到SurfaceView在所屬window中的位置。如果新建window在SurfaceView所屬window後面,SurfaceView會將它在所屬window中占據的部分變透明,以便讓後面的window顯示出來。

Bitmap

壹個Bitmap只是壹些像素數據的接口。Bitmap中的像素數據所占內存空間既可以在直接創建Bitmap時分配,也可以創建Bitmap後將它指向壹塊像素數據空間,比如,當把壹個canvas對象鏈接(hook up)到壹個surface進行繪制時,就會創建壹個Bitmap指向surface當前正在繪制的緩沖區。

補充:

SurfaceHolder

前面說到Surface持有壹塊像素,那麽我們該如何操作這些像素,或者說是如何填充他們 。其實我們我們無法直接操作Surface只能通過SurfaceHolder這個接口來獲取和操作Surface。 SurfaceHolder中提供了壹些lockCanvas(),獲取壹個Canvas對象,並鎖定之。所得到的Canvas對象,其實就是Surface中壹個成員。加鎖的目的其實就是為了在繪制的過程中, Surface中的數據不會被改變。lockCanvas是為了防止同壹時刻多個線程對同壹canvas寫入。

Canvas

畫布,壹個可以直接操作(填充)像素的地方,有點抽象概念 ,實際上每壹個畫布底部可能都是壹個bitmap,前面說到bitmap代表的就是像素數據,而Canvas需要這麽壹塊像素數據才能執行壹些繪制(填充)操作;Canvas包含許多填充像素的方法 canvas.drawXXX,當然畫布除外 還有壹個很重要的東西就是畫筆paint,填充像素其實就是改變每壹個像素點的顏色值,而畫筆的屬性則決定者每壹個像素的顏色;

  • 上一篇:virtual pc和hyper-v的區別
  • 下一篇:如何測試服務器數據庫是否連接成功
  • copyright 2024編程學習大全網