

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Android課程講義,---圖形圖像處理,View類開發(fā)框架在View類框架中,任何自定義的View類都只需要重寫onDraw( )方法來進(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)用,圖形圖像開發(fā)基礎(chǔ),圖形圖像開發(fā)基礎(chǔ),SurfaceView類開發(fā)框架surfaceView繼承自View類,它通過一個(gè)新線程來更新畫面。因此,SurfaceView更適合需要快速加載UI,或渲染代碼阻塞UI線程的時(shí)間過長的情形SurfaceView封裝了一個(gè)Surface對象,而不是Canvas,這一點(diǎn)對于那些資源敏感的操作特別有用Surfa
3、ceView一般通過使用SurfaceHolder類來控制Canvas在其surface上的操作,SurfaceHolder類可以通過getHolder( )來獲得,圖形圖像處理基礎(chǔ),SurfaceView類開發(fā)框架SurfaceHolder中的幾個(gè)重要的方法lockCanvas( )方法用于鎖定畫布,這樣Surface中就可以指定畫布了,之后就可以在畫布上進(jìn)行繪畫unlockCanvasAndPost(Canvas canvas
4、):用于釋放處于鎖定狀態(tài)的Canvas當(dāng)Surface的狀態(tài)發(fā)生改變時(shí),可以通過SurfaceHolder.Callback來獲取這些信息SurfaceHolder.Callback有三個(gè)重要的方法,surfaceChanged( )、surfaceCreated( )、surfaceDestroyed( )分別在Surface創(chuàng)建、改變、銷毀時(shí)被調(diào)用,Graphics類開發(fā),Paint和Color類畫筆Paint類包含如何繪制幾
5、何形狀、文本和位圖的樣式及顏色信息Paint文本繪制主要包括這些方面,如setColor( )、setTypeface( )、setTextSize( )等Paint圖形圖像繪制主要通過setColor( )、setStyle( )等方法來設(shè)置,Graphics類開發(fā),Paint和Color類顏色被表示為封裝的數(shù)值,這個(gè)數(shù)值由四個(gè)字節(jié)組成,分別為alpha、red、green、blue,任何透明性只存儲(chǔ)在alpha部分。Colo
6、r類定義了一些方法來創(chuàng)建和轉(zhuǎn)換顏色值。如red( int color)、green(int color)、blue(int color)等方法可以獲取一個(gè)顏色常量值的紅綠藍(lán)分色,而HSVToColor( )、RGBToHSV( )等方法可以在不同顏色空間進(jìn)行顏色的轉(zhuǎn)換。,Graphics類開發(fā),Canvas類介紹要實(shí)現(xiàn)一個(gè)吸引人的游戲,色彩艷麗的界面設(shè)計(jì)是必不可少的,這就需要Paint和Canvas配合實(shí)現(xiàn)設(shè)置Canvas屬性的常用
7、方法drawColor( ):用來設(shè)置畫布背景色,體現(xiàn)在手機(jī)上就是手機(jī)屏幕背景色clipRect( ):設(shè)置裁剪區(qū)域,即設(shè)置顯示區(qū)域rotate( ):旋轉(zhuǎn)畫布,Graphics類開發(fā),Canvas類介紹Canvas常用的繪制方法drawRect(Rect rect, Paint paint)用于繪制矩形區(qū)域drawBitmap(bitmap bitmap, Rect src, Rect dst, Paint paint)用
8、于繪制位圖drawPoint(float x, float y, Paint paint)用于畫點(diǎn)drawLine(float startX, float startY, float stopX, float stopY, Paint paint)用于畫線drawText(String text, float x, float y, Paint paint)用于在某個(gè)位置寫文本,Graphics類開發(fā),繪制圖像Android中顯
9、示圖像主要有兩步,第一步是獲取圖像資源,第二步調(diào)用畫布類的drawBitmap方法進(jìn)行圖像顯示。以SurfacView為框架在屏幕中央顯示一幅圖像如圖示,Graphics類開發(fā),圖像旋轉(zhuǎn)和縮放android中對圖像的變換操作有平移、旋轉(zhuǎn)、縮放和傾斜四種,android內(nèi)的Matrix提供了這四種操作方法Matrix在使用前必須通過reset( )或set( )被初始化。其中對應(yīng)每種操作都有三種接口setXXX, preXXX,po
10、stXXX,在調(diào)用這些操作時(shí)都可以指定操作中心setXXX將使當(dāng)前操作覆蓋以前的操作,preXXX和postXXX都是順序疊加操作,區(qū)別在于preXXX是將新變換矩陣左乘原來的操作矩陣,而postXXX是將新變換矩陣右乘原來的操作矩陣,Graphics類開發(fā),圖像旋轉(zhuǎn)和縮放圖像旋轉(zhuǎn)和縮放效果如圖示,Graphics類開發(fā),圖像像素操作對圖像像素進(jìn)行操作主要包括兩個(gè)過程,第一步首先從圖像中獲取像素值,第二步對像素值進(jìn)行處理并保存a
11、ndroid中提供了兩套操作方法,這些方法都屬于Bitmap類,第一套方法針對單像素進(jìn)行操作,getPixel( )和setPixel( ),第二套為針對批量像素進(jìn)行操作, getPixels( )和setPixels( ),Graphics類開發(fā),圖像像素操作針對單像素的方法將彩色圖像變換為黑白圖像顯示出來效果如圖示,Graphics類開發(fā),Shader類介紹Shader類來對圖形圖像進(jìn)行渲染Shader類包含了子類Bitmap
12、Shader、LinearGradient、RadialGradient、SweepGradient以及ComposeShaderBitmapShader主要用于渲染圖像,比如使圖像顯示在某種特定形狀邊界內(nèi)LinearGradient用來進(jìn)行線性梯度渲染,比如使繪制的幾何圖形產(chǎn)生一種線性過渡的色彩RadialGradient用于進(jìn)行環(huán)形渲染,比如使圓產(chǎn)生環(huán)形顏色過渡SweepGradient是掃描漸變,即圍繞一個(gè)中心點(diǎn)進(jìn)行掃描漸
13、變,類似于雷達(dá)掃描的效果ComposeShader是組合渲染,可以組合上面所述的任意兩種渲染效果,Graphics類開發(fā),雙緩沖技術(shù)在游戲開發(fā)中,當(dāng)一幅動(dòng)畫在顯示的同時(shí),假如程序又會(huì)修改它,這樣前面的畫面還沒有顯示完,程序又要求重新繪制,屏幕就會(huì)不停閃爍,為了避免閃爍,就必須使用雙緩沖技術(shù)雙緩沖原理是將要處理的圖片先在內(nèi)存中處理完后,再將其顯示到屏幕上,這樣顯示出來的就是一幅完整的圖像,不會(huì)出現(xiàn)閃爍的現(xiàn)象android里實(shí)現(xiàn)就是
14、在內(nèi)存中創(chuàng)建一個(gè)與原圖大小相同的模擬畫布,先將要處理的圖像畫在模擬畫布上,當(dāng)全部處理結(jié)束后,再將整幅圖顯示在真正的畫布上,Graphics類開發(fā),設(shè)置全屏和獲取屏幕屬性全屏顯示,就是將手機(jī)上面的電池、信號(hào)顯示所處的狀態(tài)欄以及顯示程序名稱的標(biāo)題欄隱藏起來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類開發(fā),設(shè)置全屏和獲取屏幕屬性android通過DisplayMetrics類的getWindowManager().getDefaultDisplay().getMetrics()方法來獲取分辨率,用法如下,動(dòng)畫實(shí)現(xiàn),Frame動(dòng)畫Frame動(dòng)畫是最常見的一
16、種實(shí)現(xiàn)方法,android逐幀動(dòng)畫通過android.graphics.drawable.AnimationDrawable類來實(shí)現(xiàn),在該類中保存了幀序列以及顯示的時(shí)間android提供了一種通過XML來創(chuàng)建逐幀動(dòng)畫的方式,動(dòng)畫創(chuàng)建所用的XML文件的語法格式如下:,XML文件通過animation-list來指定這是個(gè)AnimationDrawable動(dòng)畫定義,里面的item來指定每幀圖片資源路徑,duration代表當(dāng)前幀顯示的時(shí)間
17、,oneshot為true表示動(dòng)畫只播放一次停止在最后一幀上,如果設(shè)置為false表示動(dòng)畫循環(huán)播放。下面一個(gè)例子通過View顯示一個(gè)幀動(dòng)畫,動(dòng)畫實(shí)現(xiàn),Tween動(dòng)畫Tween動(dòng)畫,即通過對場景里面的對象不斷做圖像變換(平移、縮放、旋轉(zhuǎn))來產(chǎn)生動(dòng)畫效果,由此可見,實(shí)現(xiàn)Tween動(dòng)畫只需要簡單的一幅圖像就可以了,因此對資源的占用是很少的可以以XML文件方式或者源代碼方式預(yù)先為Tween定義一組指令,這些指令指定了圖形變換的類型、觸發(fā)時(shí)間
18、、持續(xù)時(shí)間等,程序沿著時(shí)間線執(zhí)行這些指令就可以實(shí)現(xiàn)動(dòng)畫效果動(dòng)畫的進(jìn)度使用Interpolator控制,android提供了幾個(gè)Interpolator子類LinearInterpolator類可以實(shí)現(xiàn)勻速效果Accelerateinterpolator類可以實(shí)現(xiàn)加速效果DecelerateInterpolator類可以實(shí)現(xiàn)減速效果,動(dòng)畫實(shí)現(xiàn),Tween動(dòng)畫Tween動(dòng)畫的兩種運(yùn)行模式獨(dú)占模式,即程序主線程進(jìn)入一個(gè)循環(huán),根據(jù)動(dòng)
19、畫指令不斷刷新屏幕,直到動(dòng)畫結(jié)束中斷模式,即有單獨(dú)一個(gè)線程對時(shí)間計(jì)數(shù),每隔一定的時(shí)間向主線程發(fā)通知,主線程接到通知后更新屏幕動(dòng)畫播放過程中對圖形的變換通過仿射矩陣實(shí)現(xiàn),簡單來說就是,每種變換都是一次矩陣運(yùn)算在android中,Canvas類中包含當(dāng)前矩陣,當(dāng)調(diào)用Canvas.drawBitmap(bmp, x, y, Paint)進(jìn)行繪制時(shí),android會(huì)先對bmp做一次矩陣運(yùn)算,然后將運(yùn)算結(jié)果顯示在Canvas上通過不斷修改
20、Canvas的矩陣并刷新屏幕,View內(nèi)的圖形就會(huì)不停的做變換,動(dòng)畫就形成了,動(dòng)畫實(shí)現(xiàn),Tween動(dòng)畫Tween動(dòng)畫的核心模塊-Animation類及其子類它實(shí)現(xiàn)了各種動(dòng)畫效果,如平移、縮放、旋轉(zhuǎn)、改變透明度等Tween動(dòng)畫的每一幀都根據(jù)Interpolator對圖形進(jìn)行一次變換Animation是基類,包含了動(dòng)畫的通用屬性和方法。主要的屬性包括動(dòng)畫持續(xù)時(shí)間、重復(fù)次數(shù)、interpolator等動(dòng)畫里最重要的方法是getTra
21、nsformation( ),該方法根據(jù)當(dāng)前時(shí)間和interpolator,計(jì)算當(dāng)前的變換并返回之TranslateAnimation、RotateAnimation、AlphaAnimation等是Animation的子類,分別實(shí)現(xiàn)了平移、旋轉(zhuǎn)、漸變等變換,動(dòng)畫實(shí)現(xiàn),Tween動(dòng)畫Animation類及其子類繼承關(guān)系圖,動(dòng)畫實(shí)現(xiàn),Tween動(dòng)畫Tween動(dòng)畫Animation類及其子類每個(gè)Animation子類都重載了父類的a
22、pplyTransformation方法,這個(gè)方法會(huì)被父類的getTransformation方法調(diào)用不同的變換具有不同的屬性,如RotateAnimation的屬性是起始角度、終止角度和旋轉(zhuǎn)點(diǎn)坐標(biāo),TranslateAnimation的屬性是起始位置和終止位置,而AlphaAnimation的屬性是起始alpha值和終止alpha值,動(dòng)畫實(shí)現(xiàn),Tween動(dòng)畫Interpolator類及其子類繼承關(guān)系圖,動(dòng)畫實(shí)現(xiàn),Tween動(dòng)畫T
23、ween動(dòng)畫Interpolator類及其子類Interpolator類及其子類Interpolator定義了動(dòng)畫的變化速度,可以實(shí)現(xiàn)勻速、正加速、負(fù)加速、無規(guī)則變加速等getInterpolation( )方法用于差值出一個(gè)時(shí)間線上的點(diǎn),用于計(jì)算圖形變換矩陣LinearInerpolator、AccelerateInterpolator, DecelerateInterpolator,AccelerateDecelerateIn
24、terpolator,CycleInterpolator 是 Interpolator的子類,分別實(shí)現(xiàn)了勻速、加速、減速、變速、循環(huán)等效果LinearInterpolator,變化率是常數(shù),即f(x)=x對于AccelerateDecelerateInterpolator,變化率開始和結(jié)束都很慢,但中間很快,即f(x)=(cos(x+1)*PI)/2.0f)+0.5f,動(dòng)畫實(shí)現(xiàn),Tween動(dòng)畫Tween動(dòng)畫Transformati
25、on類Transformation類記錄了仿射矩陣,動(dòng)畫每觸發(fā)一次,會(huì)對原來的矩陣做一次運(yùn)算,圖形的Bitmap與這個(gè)矩陣相乘就可以實(shí)現(xiàn)相應(yīng)的操作(旋轉(zhuǎn)、平移、縮放等)Transformation類有兩個(gè)重要的成員,一個(gè)是mMatrix,另一個(gè)是mAlpha,動(dòng)畫實(shí)現(xiàn),Tween動(dòng)畫View中實(shí)現(xiàn)Tween動(dòng)畫創(chuàng)建動(dòng)畫對象,這里是打開一幅圖像,調(diào)用startAnimation( )啟動(dòng)動(dòng)畫,在此例中當(dāng)按上、下、左、右鍵時(shí)分別啟動(dòng)
26、漸變、伸縮、平移和旋轉(zhuǎn)動(dòng)畫startAnimation( )中調(diào)用了invalidate( ),從而觸發(fā)onDraw函數(shù)onDraw函數(shù)中的執(zhí)行過程調(diào)用動(dòng)畫的getTransformation方法,獲取根據(jù)當(dāng)前時(shí)間和Interpolator計(jì)算的矩陣將該矩陣設(shè)置為Canvas的當(dāng)前矩陣調(diào)用Canvas的drawBitmap方法繪制屏幕判斷getTransformation的返回值,若為true,則調(diào)用invalidate方法
27、,刷新屏幕進(jìn)入下一幀,否則說明動(dòng)畫播放結(jié)束,動(dòng)畫實(shí)現(xiàn),Tween動(dòng)畫Tween動(dòng)畫XML文件進(jìn)行控制實(shí)現(xiàn)在res下新建子目錄anim,然后在該子目錄下創(chuàng)建兩個(gè)XML文件如下,動(dòng)畫實(shí)現(xiàn),Tween動(dòng)畫自定義Animation子類Android內(nèi)提供的動(dòng)畫接口畢竟有限,如果想實(shí)現(xiàn)特殊的動(dòng)畫效果,則需要自定義Animation子類自定義子類只需要繼承基類并實(shí)現(xiàn)applyTransformation( )方法即可,動(dòng)畫實(shí)現(xiàn),gif動(dòng)畫
28、播放由于差值生成各種中間變換的原因,通過Tween生成的動(dòng)畫有時(shí)候在播放時(shí)并不流暢,而gif動(dòng)畫的播放效果卻可以與flash的效果相媲美,如果在自己的游戲中添加一個(gè)gif動(dòng)畫,則可以使自己的游戲程序更加吸引用戶Android中提供了一個(gè)類:android.graphics.Movie可以用于播放gif,它的使用比較簡單使用openRawResource( )方法將gif資源打開,獲得輸入流調(diào)用Movie的decodeStream
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論