android5從入門到精通繪圖_第1頁
android5從入門到精通繪圖_第2頁
android5從入門到精通繪圖_第3頁
android5從入門到精通繪圖_第4頁
android5從入門到精通繪圖_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第十章繪圖

10.1

2D繪圖10.2

Drawable10.3

3D繪圖10.4硬件加速10.5RenderScript10.6

小結10.7

思考題10.1

2D繪圖AndroidAPI提供一系列進行2D繪圖的方法,被放置在android.graphics.drawable包下。通常有兩種2D繪圖的方法:在布局文件定義的View組件中進行繪圖。繪圖工作由系統(tǒng)的繪制進程管理,開發(fā)者只需繪制圖形即可。這種方式適合于繪制不需要實時更新的靜態(tài)圖像。在Canvas中繪圖。這種方式需要由開發(fā)者自己調用onDraw()方法來對圖像進行繪制。當圖像需要定時更新時最好使用這種方式,適合于動畫繪制和視頻游戲開發(fā)。10.1.1獲取Canvas對象要在Android系統(tǒng)下繪制圖形,需要四個基本組件,分別為:Bitmap:相當于畫布,用于管理像素。Canvas:相當于在在Bitmap上繪圖的畫家,用于管理繪制過程,提供繪圖方法。Drawable繪制要素:Drawable繪制要素包括形狀、路徑、文本,圖像等,用于將Canvas繪制的圖像顯示給用戶。Paint:相當于繪圖用到畫筆,可以設置畫筆的顏色、類型等。若在自定義的View組件上繪制圖像,只需重寫onDraw()方法即可。10.1.2使用自定義View繪圖實例MyViewCanvasDemo自定義了一個名為MyView的View類,并在其onDraw()方法中繪制了簡單的圖像,運行效果如圖10.1所示。圖10.1簡單View繪圖10.1.3使用Bitmap繪圖可以通過新建Bitmap對象,并在其上使用Canvas進行繪圖的方式創(chuàng)建圖像。實例BitmapDrawDemo演示了Canvas使用Bitmap對象繪圖的過程。該實例的繪制內(nèi)容與10.1.2節(jié)實例的繪制內(nèi)容完全相同,只不過不是直接繪制在View上,而是繪制在一個Bitmap對象上,繪制完成后,將Bitmap圖像顯示到視圖上,其運行效果如圖10.2所示。圖10.2Bitmap對象的繪圖效果10.1.4使用SurfaceView繪制靜態(tài)圖像使用SurfaceView繪圖,需要為SurfaceView對象添加SurfaceHoloder.Callback接口,并在該接口的surfaceCreated()方法中通過lockCanvas()方法獲取Canvas對象,以此保證當獲取Canvas時,SurfaceView對象可用。當繪圖工作完成后,通過SurfaceHoloder.unlockCanvas-AndPost()方法將繪圖顯示出來,并釋放Canvas對象。實例SurfaceViewDrawDemo演示了使用SurfaceView組件繪制靜態(tài)圖的過程,其繪制內(nèi)容與10.1.2節(jié)繪制內(nèi)容完全相同。通過該實例,讀者可以清楚地認識到使用SurfaceView繪圖與使用View繪圖的不同之處,該實例運行效果如圖10.3所示。圖10.3SurfaceView繪圖效果10.1.5使用SurfaceView繪制動態(tài)圖像實例SurfaceViewDrawDemo繪制的是一幅靜態(tài)圖像,而使用SurfaceView繪圖的優(yōu)點在于繪制動態(tài)圖像。繪制靜態(tài)圖像的過程應該在一個單獨的線程中完成,而不應該在主線程中進行。實例SurfaceViewDynDrawDemo演示了使用SurfaceView組件繪制動態(tài)圖像的過程。該實例修改自AndroidSDK提供的實例,繪制的是類似于Windows中的變幻線屏保的效果,運行效果如圖10.4所示。

圖10.4實例SurfaceViewDynDrawDemo運行效果10.2

Drawable

Drawable是“可繪制的東西”的抽象類,被定義在android.graphics.drawable包下。該類繼承了很多代表不同形狀的子類,例如BitmapDrawable、ShapeDrawable、PictureDrawable等等。開發(fā)者也可以定義自己的用于特定形狀繪制的子類。獲取Drawable對象有三種方式:使用工程資源文件中保存的圖像資源。使用xml文件定義的Drawable屬性。通過構造方法構建。10.2.1從資源文件中創(chuàng)建Drawable對象添加圖像到應用程序工程中最簡單的方式就是從資源文件中獲取圖像。資源文件中的圖像資源會被放置在res/drawable/文件夾下,常見的圖像資源類型有PNG、JPG和GIF,在允許的情況下,建議優(yōu)先使用PNG格式的圖像,其次是JPG格式的圖像。系統(tǒng)會自動為每個drawable文件夾下的資源文件生成一個格式為R.drawable.xxx的ID號,在工程中可以通過該ID使用該資源。在之前的實例中,我們一直在使用這種方法。10.2.2從XML文件中創(chuàng)建Drawable對象10.2.3使用構造方法創(chuàng)建Drawable對象以ShapeDrawable為例,ShapeDrawable是Drawable的子類,ShapeDrawable對象適合于動態(tài)繪制二維圖形。10.3

3D繪圖

10.3.1OpenGLES簡介OpenGL是一組跨平臺的3D圖像處理API,OpenGL是OpenGL的嵌入式版本,Android系統(tǒng)從Android1.0開始支持OpenGLES1.0和1.1,自Android2.2(APILevel8)開始,Android框架開始支持OpenGL2.0API。由于篇幅所限,在此不可能詳細地介紹OpenGLES的方方面面,僅能簡單介紹其使用方法。詳細資料讀者可以查詢AndroidSDK的相關文檔。10.3.2繪制3D圖像實例使用OpenGLESAPI繪制3D圖像,有兩個基礎的相關類,一個是GLSurfaceView類,一個是GLSurfaceView.Renderer接口。(1)GLSurfaceView類GLSurfaceView類是SurfaceView的子類,使用內(nèi)嵌的Surface進行OpenGL繪圖渲染。GLSurfaceView提供以下功能:管理Surface,Surface是一塊內(nèi)存,可以被加載到View視圖中。管理一個EGL顯示,能夠使用OpenGL把內(nèi)容渲染到surface上。接受用戶自定義渲染器用于實際渲染。使渲染器在單獨的線程總運行,和更新UI的線程相分離。支持按需渲染(on-demandrendering)和連續(xù)渲染(continuousrendering)。提供一些可選工具,如OpenGL調用的跟蹤調試和錯誤檢查等。(2)GLSurfaceView.Renderer接口GLSurfaceView.Renderer接口定義了使用OpenGL繪圖時所需的方法。該接口通過GLSurfaceView.setRenderer()與GLSurfaceView關聯(lián)在一起。該接口實現(xiàn)以下三個方法:onSurfaceCreated():當創(chuàng)建GLSurfaceView對象后該方法被系統(tǒng)調用一次。通常在該方法中設置OpenGL環(huán)境的相關參數(shù),初始化OpenGL圖形對象等。onDrawFrame():GLSurfaceView對象每一次重繪時系統(tǒng)都會調用該方法。該方法應該執(zhí)行具體的繪圖工作。onSurfaceChanged():當GLSurfaceView對象的幾何外形改變時,包括GLSurfaceView的尺寸發(fā)生改變、設備屏幕的方向發(fā)生改變等情況,該方法被系統(tǒng)調用。實例OpenGLDemo演示了在Activity中使用GLSurfaceView和GLSurfaceView.Renderer合作繪制三維圖形的過程。該實例繪制了一個不斷旋轉的立方體,運行效果如圖10.5所示圖10.5實例OpenGLDemo運行效果10.4硬件加速

從Android3.0(APILevel11)開始,Android2D渲染管線被設計為能更好地支持硬件加速功能。硬件加速功能將所有在View組件的Canvas上執(zhí)行的繪制操作都交由GPU來完成。由于硬件加速功能需要更多的資源,因此啟用硬件加速功能的應用程序會耗費更多的內(nèi)存資源。10.4.1啟用硬件加速啟用硬件加速最簡單的方法是在總體上位整個應用程序打開硬件加速功能。如果應用程序中僅僅使用了標準的View和Drawable對象進行圖像繪制,那么在總體上打開硬件加速功能不會出現(xiàn)任何的不良影響。但是,由于硬件加速功能并不是被所有的2D繪制操作所支持,因此對于一些自定義的View組件和Drawable對象的繪制,可能會出現(xiàn)無法顯示、異常或者錯誤渲染的點等問題。為了避免這類問題的發(fā)生,Android平臺提供了以下四個應用層次的硬件加速開關設置:Application,應用程序級。Activity,視圖級。Window,窗口級。View,組件級。10.4.2Android繪圖模型1.基于軟件的繪圖模型當應用程序需要更新UI的某一個部分時,會通過更改了內(nèi)容的View組件調用invalidate()方法將當前組件無效化。該方法觸發(fā)一個重繪消息,該消息會沿著視圖的層次一直向上傳遞,以計算需要重繪的區(qū)域。然后Android系統(tǒng)會重繪在視圖層次中與要重繪區(qū)域有交叉的所有組件?;谲浖睦L圖模式主要完成如下兩個工作:無效化繪圖層次重繪繪圖層次這種繪圖模型有兩個缺點:首先,這個模型會導致在消息傳遞過程中多執(zhí)行大量無效的繪圖代碼。例如,一個按鈕位于一個View上,當該按鈕被單擊時,雖然該View沒有發(fā)生任何的改變,但是在這種繪圖模型下,該View也會被重繪。第二個缺點是這種繪圖模型可能隱藏應用程序中的bug。由于Android系統(tǒng)會重繪所有與需重繪區(qū)域有交叉的View組件,一個被用戶改變了內(nèi)容的View組件可能會被重繪,即使該組件沒有調用invalidate()方法。當這種情況發(fā)生的時候,用戶只能依靠另外一個組件的重繪操作來獲取自己想要的效果,而這種效果可能會不斷改變。因此,開發(fā)者應該在自定義的組件上不斷的調用invalidate()方法以保證內(nèi)容顯示正確,無論該組件的內(nèi)容是否被改變。當Android組件的內(nèi)容發(fā)生改變,如背景色改變或者文本改變時,該組件會自動調用invalidate()方法。2.硬件加速繪制模型在硬件加速繪制模型下,Android系統(tǒng)依然使用invalidate()方法和draw()方法來對屏幕進行更新并繪制圖形,但是具體處理的方法有所不同。這種模式下Android系統(tǒng)并沒有馬上執(zhí)行繪圖命令,而是記錄了當前視圖的顯示列表。顯示列表中包含了視圖層次中所有繪圖代碼的輸出。Android系統(tǒng)只需要錄制并且更新需要重繪組件的顯示列表即可。那些沒有被無效化的組件可以簡單通過重新使用之前記錄的顯示列表的方式來重繪圖形。硬件加速繪圖模型主要完成如下三個工作:無效化視圖的繪圖層次記錄并更新顯示列表繪制顯示列表在這種模式下,與不能依靠與需要更新區(qū)域有交叉的組件的draw()方法來更新圖像,而是應該調用invalidate()方法來使Android系統(tǒng)記錄組件的顯示列表。如果沒有這樣做,該組件的更新將不會顯示出來。使用顯示列表方式繪制圖像對動畫繪制也有很大好處。因為設置特定屬性,例如透明度、旋轉燈,不需要重新繪制整個視圖,而只需對特定屬性進行更改即可。例如,假如有一個LinearLayout,該LinearLayout中包含一個ListView組件和一個Button組件,ListView組件被放置在Button組件的上面。該LinearLayout組件的顯示列表如下所示:DrawDisplayList(ListeView)DrawDisplayList(Button)如果開發(fā)者需要更改ListView的透明度,那么通過ListView對象調用了setAlpha(0.5f)方法后,LinearLayout的顯示列表如下:SaveLayerAlpha(0.5)DrawDisplayList(ListeView)RestoreDrawDisplayList(Button)由此可見,繪圖ListView的復雜代碼并沒有被執(zhí)行,系統(tǒng)只是簡單更新了LinearLayout的顯示列表。對于一個沒有被硬件加速的應用程序,該過程中的每一行代碼都會被重新執(zhí)行一次。10.5RenderScript

Renderscript基于C99標準,提供了一個平臺獨立的運行在底層的計算引擎,用于加速需要大量計算的應用程序,常用于3D圖像渲染。RenderScript主要優(yōu)點如下:可移植性:RenderScript被設計為在各種具有不同CPU和CPU架構的設備上運行。由于其代碼是在運行設備上進行編譯和緩存的,因此RenderScript可以支持所有架構而不需要針對某種架構具體編程。性能:RenderScript能夠提供與OpenGL相似的性能,同時提供與Android框架提供的OpenGLAPI(android.opengl)相同的移植性。另外,RenderScript提供OpenGL所沒有的高性能計算API??捎眯裕篟enderScript盡可能簡化了開發(fā)過程。當然,RenderScript也有缺點,主要表現(xiàn)在:開發(fā)復雜:RenderScript提供資金的API集合,開發(fā)者需要重新學習。RenderScript處理內(nèi)存的方式與OpenGL不同。調試可見:RenderScript可以在其他處理器上被執(zhí)行,而不是主CPU上。在這種情況下,調試變得很困難。特性較少:RenderScript不像OpenGL那樣提供很多特性,例如壓縮紋理格式或者GL擴展。10.5.1RenderScript綜述RenderScript采用的是主從結構。底層的本地化代碼被高層的運行的虛擬機中的Android系統(tǒng)控制。Android虛擬機保有內(nèi)存和聲明周期的控制權,在需要的時候調用本地的RenderScript代碼。本地化代碼被編譯為中間的字節(jié)碼,并且被打包到應用程序的.apk文件中。當應用程序在設備上運行的時候,字節(jié)碼被編譯為針對當前機器優(yōu)化的機器碼。編譯的字節(jié)碼被緩存起來,因此之后需要使用RenderScript代碼時不需要重新編譯。RenderScript有三個層次的代碼,允許本地化代碼和Android框架之間進行通信。本地RenderScript層:該層負責密集運算或者圖像渲染,相關代碼被保存在.rs或者.rsh文件中。反射層:該層由一系列類組成,這些類由本地代碼反射而來。基本上是對本地代碼的包裝,以允許Android框架與本地RenderScript代碼進行交互。AndroidBuild工具自動生成該層的相關類。Android框架層:該層由Android框架API組成,包括android.renderscript包。該層用于給反射層發(fā)出高級命令,如“旋轉視圖”或者“過濾位圖”,然后反射層將命令傳送給本地層執(zhí)行。(1)本地RenderScript庫的關鍵特性包括:大量針對標量和向量計算的數(shù)學函數(shù),包含加、乘、加乘、點乘等。原始數(shù)據(jù)與向量的轉換例程,矩陣例程、日期和時間例程、圖像例程等。日志函數(shù)。圖形渲染函數(shù)。內(nèi)存分配請求特性。支持RenderScript系統(tǒng)的數(shù)據(jù)類型和結構,例如二維向量、三維向量、思維向量等。RenderScript庫相關頭文件被放置在<Androidsdk_root>/platform-tools/renderscript/include目錄下。該目錄下的頭文件會被自動保存進.rs文件中,除了RenderScript的圖像處理頭文件。因此需要使用下面的代碼手工導入:#include"rs_graphics.rsh"(2)反射層是一組由AndroidBuild工具生成的類,可以從Android虛擬機訪問本地的RenderScript代碼。反射層定義了RenderScript函數(shù)和變量的訪問點,以便Android框架能夠訪問透明。該層也提供了構造方法,用于為定義在RenderScript代碼中的指針分配內(nèi)存。下面簡單介紹被反射的主要組件:每個.rs文件都生成一個類,被存放在名為ScriptC_renderscript_filename的ScriptC類型的文件中,它相當于.rs文件的.java版本,可以被Android框架調用。該類包含了下列反射:.rs文件中的非靜態(tài)方法。非靜態(tài)的全局的RenderScript變量。全局指針。(3)Android框架層由通常的Android框架API組成,包含android.renderscript包。該層管理Activity的聲明周期以及應用程序的內(nèi)存分配。它通過反射層發(fā)送命令給本地RenderScript代碼,并接收用戶事件按需傳遞給RenderScript代碼。10.5.2使用動態(tài)分配的內(nèi)存涉及RenderScript內(nèi)存分配API的類有三個:Element:內(nèi)存分配的基本單位,可以是基本的數(shù)據(jù)類型或者是復合類型。Type:表示要分配的元素個數(shù)。Allocation:用于執(zhí)行分配內(nèi)存操作。RenderScript支持指針,但是必須在Android框架代碼中為它分配內(nèi)存。當開發(fā)者在.rs文件中聲明一個全局的指針時,需要通過合適的反射層類來分配內(nèi)存,并將其綁定到本地的RenderScript層。開發(fā)者可以通過Android框架層和RenderScript層讀寫該內(nèi)存。1.定義指針2.反射指針3.分配并綁定內(nèi)存到RenderScript4.讀寫內(nèi)存10.5.3使用靜態(tài)分配的內(nèi)存在RenderScript中聲明的非靜態(tài)的全局原始數(shù)據(jù)類型和結構體很容易使用,因為這些內(nèi)存是靜態(tài)分配的。AndroidBuild工具在生成反射層類時會自動為這些變量生成存取方法,開發(fā)者可以通過這些方法來使用靜態(tài)分配的內(nèi)存。10.6

小結

本章簡單介紹了Android系統(tǒng)下繪圖的相關方法。Android系統(tǒng)提供了一系列方法可供開發(fā)者繪制自己所需要的2D或者3D

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論