第八章圖形圖像處理_第1頁(yè)
已閱讀1頁(yè),還剩30頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Android課程講義,---圖形圖像處理,View類(lèi)開(kāi)發(fā)框架在View類(lèi)框架中,任何自定義的View類(lèi)都只需要重寫(xiě)onDraw( )方法來(lái)進(jìn)行界面的顯示onDraw( )方法不能被直接調(diào)用,想要重新加載界面通常有兩種方法,一種是在Handler中調(diào)用invalidate,另一種是直接在線程中調(diào)用postInvalidate( )invalidate( )不能直接在工作者線程中進(jìn)行調(diào)用,因?yàn)樗`背了單線程模型,而android的U

2、I操作并不是線程安全的。而postInvalidate()可以在工作者線程中直接進(jìn)行調(diào)用,圖形圖像開(kāi)發(fā)基礎(chǔ),圖形圖像開(kāi)發(fā)基礎(chǔ),SurfaceView類(lèi)開(kāi)發(fā)框架surfaceView繼承自View類(lèi),它通過(guò)一個(gè)新線程來(lái)更新畫(huà)面。因此,SurfaceView更適合需要快速加載UI,或渲染代碼阻塞UI線程的時(shí)間過(guò)長(zhǎng)的情形SurfaceView封裝了一個(gè)Surface對(duì)象,而不是Canvas,這一點(diǎn)對(duì)于那些資源敏感的操作特別有用Surfa

3、ceView一般通過(guò)使用SurfaceHolder類(lèi)來(lái)控制Canvas在其surface上的操作,SurfaceHolder類(lèi)可以通過(guò)getHolder( )來(lái)獲得,圖形圖像處理基礎(chǔ),SurfaceView類(lèi)開(kāi)發(fā)框架SurfaceHolder中的幾個(gè)重要的方法lockCanvas( )方法用于鎖定畫(huà)布,這樣Surface中就可以指定畫(huà)布了,之后就可以在畫(huà)布上進(jìn)行繪畫(huà)unlockCanvasAndPost(Canvas canvas

4、):用于釋放處于鎖定狀態(tài)的Canvas當(dāng)Surface的狀態(tài)發(fā)生改變時(shí),可以通過(guò)SurfaceHolder.Callback來(lái)獲取這些信息SurfaceHolder.Callback有三個(gè)重要的方法,surfaceChanged( )、surfaceCreated( )、surfaceDestroyed( )分別在Surface創(chuàng)建、改變、銷(xiāo)毀時(shí)被調(diào)用,Graphics類(lèi)開(kāi)發(fā),Paint和Color類(lèi)畫(huà)筆Paint類(lèi)包含如何繪制幾

5、何形狀、文本和位圖的樣式及顏色信息Paint文本繪制主要包括這些方面,如setColor( )、setTypeface( )、setTextSize( )等Paint圖形圖像繪制主要通過(guò)setColor( )、setStyle( )等方法來(lái)設(shè)置,Graphics類(lèi)開(kāi)發(fā),Paint和Color類(lèi)顏色被表示為封裝的數(shù)值,這個(gè)數(shù)值由四個(gè)字節(jié)組成,分別為alpha、red、green、blue,任何透明性只存儲(chǔ)在alpha部分。Colo

6、r類(lèi)定義了一些方法來(lái)創(chuàng)建和轉(zhuǎn)換顏色值。如red( int color)、green(int color)、blue(int color)等方法可以獲取一個(gè)顏色常量值的紅綠藍(lán)分色,而HSVToColor( )、RGBToHSV( )等方法可以在不同顏色空間進(jìn)行顏色的轉(zhuǎn)換。,Graphics類(lèi)開(kāi)發(fā),Canvas類(lèi)介紹要實(shí)現(xiàn)一個(gè)吸引人的游戲,色彩艷麗的界面設(shè)計(jì)是必不可少的,這就需要Paint和Canvas配合實(shí)現(xiàn)設(shè)置Canvas屬性的常用

7、方法drawColor( ):用來(lái)設(shè)置畫(huà)布背景色,體現(xiàn)在手機(jī)上就是手機(jī)屏幕背景色clipRect( ):設(shè)置裁剪區(qū)域,即設(shè)置顯示區(qū)域rotate( ):旋轉(zhuǎn)畫(huà)布,Graphics類(lèi)開(kāi)發(fā),Canvas類(lèi)介紹Canvas常用的繪制方法drawRect(Rect rect, Paint paint)用于繪制矩形區(qū)域drawBitmap(bitmap bitmap, Rect src, Rect dst, Paint paint)用

8、于繪制位圖drawPoint(float x, float y, Paint paint)用于畫(huà)點(diǎn)drawLine(float startX, float startY, float stopX, float stopY, Paint paint)用于畫(huà)線drawText(String text, float x, float y, Paint paint)用于在某個(gè)位置寫(xiě)文本,Graphics類(lèi)開(kāi)發(fā),繪制圖像Android中顯

9、示圖像主要有兩步,第一步是獲取圖像資源,第二步調(diào)用畫(huà)布類(lèi)的drawBitmap方法進(jìn)行圖像顯示。以SurfacView為框架在屏幕中央顯示一幅圖像如圖示,Graphics類(lèi)開(kāi)發(fā),圖像旋轉(zhuǎn)和縮放android中對(duì)圖像的變換操作有平移、旋轉(zhuǎn)、縮放和傾斜四種,android內(nèi)的Matrix提供了這四種操作方法Matrix在使用前必須通過(guò)reset( )或set( )被初始化。其中對(duì)應(yīng)每種操作都有三種接口setXXX, preXXX,po

10、stXXX,在調(diào)用這些操作時(shí)都可以指定操作中心setXXX將使當(dāng)前操作覆蓋以前的操作,preXXX和postXXX都是順序疊加操作,區(qū)別在于preXXX是將新變換矩陣左乘原來(lái)的操作矩陣,而postXXX是將新變換矩陣右乘原來(lái)的操作矩陣,Graphics類(lèi)開(kāi)發(fā),圖像旋轉(zhuǎn)和縮放圖像旋轉(zhuǎn)和縮放效果如圖示,Graphics類(lèi)開(kāi)發(fā),圖像像素操作對(duì)圖像像素進(jìn)行操作主要包括兩個(gè)過(guò)程,第一步首先從圖像中獲取像素值,第二步對(duì)像素值進(jìn)行處理并保存a

11、ndroid中提供了兩套操作方法,這些方法都屬于Bitmap類(lèi),第一套方法針對(duì)單像素進(jìn)行操作,getPixel( )和setPixel( ),第二套為針對(duì)批量像素進(jìn)行操作, getPixels( )和setPixels( ),Graphics類(lèi)開(kāi)發(fā),圖像像素操作針對(duì)單像素的方法將彩色圖像變換為黑白圖像顯示出來(lái)效果如圖示,Graphics類(lèi)開(kāi)發(fā),Shader類(lèi)介紹Shader類(lèi)來(lái)對(duì)圖形圖像進(jìn)行渲染Shader類(lèi)包含了子類(lèi)Bitmap

12、Shader、LinearGradient、RadialGradient、SweepGradient以及ComposeShaderBitmapShader主要用于渲染圖像,比如使圖像顯示在某種特定形狀邊界內(nèi)LinearGradient用來(lái)進(jìn)行線性梯度渲染,比如使繪制的幾何圖形產(chǎn)生一種線性過(guò)渡的色彩RadialGradient用于進(jìn)行環(huán)形渲染,比如使圓產(chǎn)生環(huán)形顏色過(guò)渡SweepGradient是掃描漸變,即圍繞一個(gè)中心點(diǎn)進(jìn)行掃描漸

13、變,類(lèi)似于雷達(dá)掃描的效果ComposeShader是組合渲染,可以組合上面所述的任意兩種渲染效果,Graphics類(lèi)開(kāi)發(fā),雙緩沖技術(shù)在游戲開(kāi)發(fā)中,當(dāng)一幅動(dòng)畫(huà)在顯示的同時(shí),假如程序又會(huì)修改它,這樣前面的畫(huà)面還沒(méi)有顯示完,程序又要求重新繪制,屏幕就會(huì)不停閃爍,為了避免閃爍,就必須使用雙緩沖技術(shù)雙緩沖原理是將要處理的圖片先在內(nèi)存中處理完后,再將其顯示到屏幕上,這樣顯示出來(lái)的就是一幅完整的圖像,不會(huì)出現(xiàn)閃爍的現(xiàn)象android里實(shí)現(xiàn)就是

14、在內(nèi)存中創(chuàng)建一個(gè)與原圖大小相同的模擬畫(huà)布,先將要處理的圖像畫(huà)在模擬畫(huà)布上,當(dāng)全部處理結(jié)束后,再將整幅圖顯示在真正的畫(huà)布上,Graphics類(lèi)開(kāi)發(fā),設(shè)置全屏和獲取屏幕屬性全屏顯示,就是將手機(jī)上面的電池、信號(hào)顯示所處的狀態(tài)欄以及顯示程序名稱(chēng)的標(biāo)題欄隱藏起來(lái)requestWindowsFeature(Window.FEATURE_NO_TITLE)可以實(shí)現(xiàn)隱藏標(biāo)題欄getWindows.setFlags(WindowManager.La

15、youtParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN)實(shí)現(xiàn)了狀態(tài)欄的隱藏,Graphics類(lèi)開(kāi)發(fā),設(shè)置全屏和獲取屏幕屬性android通過(guò)DisplayMetrics類(lèi)的getWindowManager().getDefaultDisplay().getMetrics()方法來(lái)獲取分辨率,用法如下,動(dòng)畫(huà)實(shí)現(xiàn),Frame動(dòng)畫(huà)Frame動(dòng)畫(huà)是最常見(jiàn)的一

16、種實(shí)現(xiàn)方法,android逐幀動(dòng)畫(huà)通過(guò)android.graphics.drawable.AnimationDrawable類(lèi)來(lái)實(shí)現(xiàn),在該類(lèi)中保存了幀序列以及顯示的時(shí)間android提供了一種通過(guò)XML來(lái)創(chuàng)建逐幀動(dòng)畫(huà)的方式,動(dòng)畫(huà)創(chuàng)建所用的XML文件的語(yǔ)法格式如下:,XML文件通過(guò)animation-list來(lái)指定這是個(gè)AnimationDrawable動(dòng)畫(huà)定義,里面的item來(lái)指定每幀圖片資源路徑,duration代表當(dāng)前幀顯示的時(shí)間

17、,oneshot為true表示動(dòng)畫(huà)只播放一次停止在最后一幀上,如果設(shè)置為false表示動(dòng)畫(huà)循環(huán)播放。下面一個(gè)例子通過(guò)View顯示一個(gè)幀動(dòng)畫(huà),動(dòng)畫(huà)實(shí)現(xiàn),Tween動(dòng)畫(huà)Tween動(dòng)畫(huà),即通過(guò)對(duì)場(chǎng)景里面的對(duì)象不斷做圖像變換(平移、縮放、旋轉(zhuǎn))來(lái)產(chǎn)生動(dòng)畫(huà)效果,由此可見(jiàn),實(shí)現(xiàn)Tween動(dòng)畫(huà)只需要簡(jiǎn)單的一幅圖像就可以了,因此對(duì)資源的占用是很少的可以以XML文件方式或者源代碼方式預(yù)先為T(mén)ween定義一組指令,這些指令指定了圖形變換的類(lèi)型、觸發(fā)時(shí)間

18、、持續(xù)時(shí)間等,程序沿著時(shí)間線執(zhí)行這些指令就可以實(shí)現(xiàn)動(dòng)畫(huà)效果動(dòng)畫(huà)的進(jìn)度使用Interpolator控制,android提供了幾個(gè)Interpolator子類(lèi)LinearInterpolator類(lèi)可以實(shí)現(xiàn)勻速效果Accelerateinterpolator類(lèi)可以實(shí)現(xiàn)加速效果DecelerateInterpolator類(lèi)可以實(shí)現(xiàn)減速效果,動(dòng)畫(huà)實(shí)現(xiàn),Tween動(dòng)畫(huà)Tween動(dòng)畫(huà)的兩種運(yùn)行模式獨(dú)占模式,即程序主線程進(jìn)入一個(gè)循環(huán),根據(jù)動(dòng)

19、畫(huà)指令不斷刷新屏幕,直到動(dòng)畫(huà)結(jié)束中斷模式,即有單獨(dú)一個(gè)線程對(duì)時(shí)間計(jì)數(shù),每隔一定的時(shí)間向主線程發(fā)通知,主線程接到通知后更新屏幕動(dòng)畫(huà)播放過(guò)程中對(duì)圖形的變換通過(guò)仿射矩陣實(shí)現(xiàn),簡(jiǎn)單來(lái)說(shuō)就是,每種變換都是一次矩陣運(yùn)算在android中,Canvas類(lèi)中包含當(dāng)前矩陣,當(dāng)調(diào)用Canvas.drawBitmap(bmp, x, y, Paint)進(jìn)行繪制時(shí),android會(huì)先對(duì)bmp做一次矩陣運(yùn)算,然后將運(yùn)算結(jié)果顯示在Canvas上通過(guò)不斷修改

20、Canvas的矩陣并刷新屏幕,View內(nèi)的圖形就會(huì)不停的做變換,動(dòng)畫(huà)就形成了,動(dòng)畫(huà)實(shí)現(xiàn),Tween動(dòng)畫(huà)Tween動(dòng)畫(huà)的核心模塊-Animation類(lèi)及其子類(lèi)它實(shí)現(xiàn)了各種動(dòng)畫(huà)效果,如平移、縮放、旋轉(zhuǎn)、改變透明度等Tween動(dòng)畫(huà)的每一幀都根據(jù)Interpolator對(duì)圖形進(jìn)行一次變換Animation是基類(lèi),包含了動(dòng)畫(huà)的通用屬性和方法。主要的屬性包括動(dòng)畫(huà)持續(xù)時(shí)間、重復(fù)次數(shù)、interpolator等動(dòng)畫(huà)里最重要的方法是getTra

21、nsformation( ),該方法根據(jù)當(dāng)前時(shí)間和interpolator,計(jì)算當(dāng)前的變換并返回之TranslateAnimation、RotateAnimation、AlphaAnimation等是Animation的子類(lèi),分別實(shí)現(xiàn)了平移、旋轉(zhuǎn)、漸變等變換,動(dòng)畫(huà)實(shí)現(xiàn),Tween動(dòng)畫(huà)Animation類(lèi)及其子類(lèi)繼承關(guān)系圖,動(dòng)畫(huà)實(shí)現(xiàn),Tween動(dòng)畫(huà)Tween動(dòng)畫(huà)Animation類(lèi)及其子類(lèi)每個(gè)Animation子類(lèi)都重載了父類(lèi)的a

22、pplyTransformation方法,這個(gè)方法會(huì)被父類(lèi)的getTransformation方法調(diào)用不同的變換具有不同的屬性,如RotateAnimation的屬性是起始角度、終止角度和旋轉(zhuǎn)點(diǎn)坐標(biāo),TranslateAnimation的屬性是起始位置和終止位置,而AlphaAnimation的屬性是起始alpha值和終止alpha值,動(dòng)畫(huà)實(shí)現(xiàn),Tween動(dòng)畫(huà)Interpolator類(lèi)及其子類(lèi)繼承關(guān)系圖,動(dòng)畫(huà)實(shí)現(xiàn),Tween動(dòng)畫(huà)T

23、ween動(dòng)畫(huà)Interpolator類(lèi)及其子類(lèi)Interpolator類(lèi)及其子類(lèi)Interpolator定義了動(dòng)畫(huà)的變化速度,可以實(shí)現(xiàn)勻速、正加速、負(fù)加速、無(wú)規(guī)則變加速等getInterpolation( )方法用于差值出一個(gè)時(shí)間線上的點(diǎn),用于計(jì)算圖形變換矩陣LinearInerpolator、AccelerateInterpolator, DecelerateInterpolator,AccelerateDecelerateIn

24、terpolator,CycleInterpolator 是 Interpolator的子類(lèi),分別實(shí)現(xiàn)了勻速、加速、減速、變速、循環(huán)等效果LinearInterpolator,變化率是常數(shù),即f(x)=x對(duì)于AccelerateDecelerateInterpolator,變化率開(kāi)始和結(jié)束都很慢,但中間很快,即f(x)=(cos(x+1)*PI)/2.0f)+0.5f,動(dòng)畫(huà)實(shí)現(xiàn),Tween動(dòng)畫(huà)Tween動(dòng)畫(huà)Transformati

25、on類(lèi)Transformation類(lèi)記錄了仿射矩陣,動(dòng)畫(huà)每觸發(fā)一次,會(huì)對(duì)原來(lái)的矩陣做一次運(yùn)算,圖形的Bitmap與這個(gè)矩陣相乘就可以實(shí)現(xiàn)相應(yīng)的操作(旋轉(zhuǎn)、平移、縮放等)Transformation類(lèi)有兩個(gè)重要的成員,一個(gè)是mMatrix,另一個(gè)是mAlpha,動(dòng)畫(huà)實(shí)現(xiàn),Tween動(dòng)畫(huà)View中實(shí)現(xiàn)Tween動(dòng)畫(huà)創(chuàng)建動(dòng)畫(huà)對(duì)象,這里是打開(kāi)一幅圖像,調(diào)用startAnimation( )啟動(dòng)動(dòng)畫(huà),在此例中當(dāng)按上、下、左、右鍵時(shí)分別啟動(dòng)

26、漸變、伸縮、平移和旋轉(zhuǎn)動(dòng)畫(huà)startAnimation( )中調(diào)用了invalidate( ),從而觸發(fā)onDraw函數(shù)onDraw函數(shù)中的執(zhí)行過(guò)程調(diào)用動(dòng)畫(huà)的getTransformation方法,獲取根據(jù)當(dāng)前時(shí)間和Interpolator計(jì)算的矩陣將該矩陣設(shè)置為Canvas的當(dāng)前矩陣調(diào)用Canvas的drawBitmap方法繪制屏幕判斷getTransformation的返回值,若為true,則調(diào)用invalidate方法

27、,刷新屏幕進(jìn)入下一幀,否則說(shuō)明動(dòng)畫(huà)播放結(jié)束,動(dòng)畫(huà)實(shí)現(xiàn),Tween動(dòng)畫(huà)Tween動(dòng)畫(huà)XML文件進(jìn)行控制實(shí)現(xiàn)在res下新建子目錄anim,然后在該子目錄下創(chuàng)建兩個(gè)XML文件如下,動(dòng)畫(huà)實(shí)現(xiàn),Tween動(dòng)畫(huà)自定義Animation子類(lèi)Android內(nèi)提供的動(dòng)畫(huà)接口畢竟有限,如果想實(shí)現(xiàn)特殊的動(dòng)畫(huà)效果,則需要自定義Animation子類(lèi)自定義子類(lèi)只需要繼承基類(lèi)并實(shí)現(xiàn)applyTransformation( )方法即可,動(dòng)畫(huà)實(shí)現(xiàn),gif動(dòng)畫(huà)

28、播放由于差值生成各種中間變換的原因,通過(guò)Tween生成的動(dòng)畫(huà)有時(shí)候在播放時(shí)并不流暢,而gif動(dòng)畫(huà)的播放效果卻可以與flash的效果相媲美,如果在自己的游戲中添加一個(gè)gif動(dòng)畫(huà),則可以使自己的游戲程序更加吸引用戶(hù)Android中提供了一個(gè)類(lèi):android.graphics.Movie可以用于播放gif,它的使用比較簡(jiǎn)單使用openRawResource( )方法將gif資源打開(kāi),獲得輸入流調(diào)用Movie的decodeStream

溫馨提示

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

評(píng)論

0/150

提交評(píng)論