第六章圖形與圖像處理_第1頁(yè)
第六章圖形與圖像處理_第2頁(yè)
第六章圖形與圖像處理_第3頁(yè)
第六章圖形與圖像處理_第4頁(yè)
第六章圖形與圖像處理_第5頁(yè)
已閱讀5頁(yè),還剩56頁(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)介

第六章圖形與圖像處理管理科學(xué)工程學(xué)院王華杰

ocam@163.com

/basilwang

/basilwang本章要點(diǎn)Android的圖形處理基礎(chǔ)Bitmap與BitmapFactory繼承View實(shí)現(xiàn)繪圖掌握Canvas、Paint、Path等繪圖API雙緩沖機(jī)制使用Matrix對(duì)圖像進(jìn)行幾何變換通過(guò)drawBitmapMesh方法扭曲圖像使用不同的Shader類(lèi)渲染圖形逐幀動(dòng)畫(huà)和補(bǔ)間動(dòng)畫(huà)SurfaceView本章內(nèi)容一

使用簡(jiǎn)單圖片二繪圖三圖形特效處理四逐幀(Frame)動(dòng)畫(huà)五補(bǔ)間(Tween)動(dòng)畫(huà)六SurfaceView的繪圖機(jī)制一使用簡(jiǎn)單圖片前面的Android應(yīng)用中已經(jīng)大量使用了簡(jiǎn)單圖片,圖片不僅可以使用ImageView來(lái)顯示,也可作為Button、Window的背景。從廣義的角度來(lái)看,Android應(yīng)用中的圖片不僅包括*.png、*.jpg、*.gif等各種格式的位圖,也包括使用XML資源文件定義的各種Drawable對(duì)象。一使用簡(jiǎn)單圖片使用Drawable對(duì)象

當(dāng)我們?yōu)锳ndroid應(yīng)用增加了Drawable資源以后,AndroidSDK會(huì)為這份資源在R清單文件中創(chuàng)建一個(gè)索引項(xiàng):R.drawable.file_name。

接下來(lái)既可在XML資源文件中通過(guò)@drawable/file_name來(lái)訪問(wèn)該Drawable對(duì)象,也可在Java代碼中通過(guò)R.drawable.file_name訪問(wèn)該Drawable對(duì)象。R.drawable.file_name是一個(gè)int類(lèi)型的常量,它只代表Drawable對(duì)象的ID,如果Java程序中需要獲取實(shí)際的Drawable對(duì)象,則可調(diào)用Resources的getDrawable(intid)方法來(lái)獲取。一使用簡(jiǎn)單圖片動(dòng)手例子:

圖片局部放大

對(duì)應(yīng)項(xiàng)目android_04_ImageViewExample

一使用簡(jiǎn)單圖片Bitmap和BitmapFactoryBitmap代表一張位圖,BitmapDrawable里封裝的圖片就是一個(gè)Bitmap對(duì)象。我們可以把一個(gè)Bitmap對(duì)象包裝成BitmapDrawable對(duì)象,可以調(diào)用BitmapDrawable的構(gòu)造器

BitmapDrawabledrawalbe=newBitmapDrawable(bitmap);如果需要獲取BitmapDrawable所包裝的Bitmap對(duì)象,則可調(diào)用BitmapDrawable的getBitmap()方法,如下面的代碼所示:

Bitmapbitmap=drawable.getBitmap();一使用簡(jiǎn)單圖片Bitmap和BitmapFactory除此之外,Bitmap還提供了一些靜態(tài)方法來(lái)創(chuàng)建新的Bitmap對(duì)象,例如如下常用方法。createBitmap(Bitmapsource,intx,inty,intwidth,intheight):從源位圖source的指定坐標(biāo)點(diǎn)(給定x,y)開(kāi)始,從中截取寬width、高h(yuǎn)eight,創(chuàng)建新的Bitmap對(duì)象。createScaledBitmap(Bitmapsrc,intdstWidth,intdstHeight,booleanfilter):對(duì)源位圖src進(jìn)行縮放,縮放成寬dstWidth、高dstHeight的新位圖。createBitmap(intwidth,intheight,Bitmap.Configconfig):創(chuàng)建一個(gè)新位圖createBitmap(Bitmapsource,intx,inty,intwidth,intheight,Matrixm,booleanfilter):從源位圖source的指定坐標(biāo)點(diǎn)(給定x,y)開(kāi)始,從中截取寬width、高h(yuǎn)eight,創(chuàng)建新的Bitmap對(duì)象,并按Matrix指定的規(guī)則進(jìn)行變換。一使用簡(jiǎn)單圖片BitmapFactory是一個(gè)工具類(lèi),它用于提供大量的方法,這些方法可用于從不同的數(shù)據(jù)源來(lái)解析、創(chuàng)建Bitmap對(duì)象。BitmapFactory包含了如下方法。decodeByteArray(byte[]data,intoffset,intlength):從指定字節(jié)數(shù)組的offset位置開(kāi)始,將長(zhǎng)度為length的字節(jié)數(shù)據(jù)解析成Bitmap對(duì)象decodeFile(StringpathName):從pathName指定的文件中解析、創(chuàng)建Bitmap對(duì)象。decodeFileDescriptor(FileDescriptorfd):用于從FileDescriptor對(duì)應(yīng)的文件中解析、創(chuàng)建Bitmap對(duì)象decodeStream(inputStreamis):用于從指定輸出流中解析、創(chuàng)建Bitmap對(duì)象一使用簡(jiǎn)單圖片大部分時(shí)候,我們只要把圖片放在/res/drawable目錄下,就可以在程序中通過(guò)該圖片對(duì)應(yīng)的資源ID來(lái)獲取封裝該圖片的Drawable對(duì)象。但由于手機(jī)系統(tǒng)的內(nèi)存比較小,如果系統(tǒng)不停地去解析、創(chuàng)建Bitmap對(duì)象,可能由于前面創(chuàng)建Bitmap所占用的內(nèi)存還沒(méi)有回收,而導(dǎo)致程序運(yùn)行時(shí)引發(fā)OutOfMemory錯(cuò)誤。Android為Bitmap提供了兩個(gè)方法來(lái)判斷它是否已回收,以及強(qiáng)制Bitmap回收自己。booleanisRecycled():返回該Bitmap對(duì)象是否已被回收voidrecycle():強(qiáng)制一個(gè)Bitmap對(duì)象立即回收自己一使用簡(jiǎn)單圖片除此之外,如果Android應(yīng)用需要訪問(wèn)其他存儲(chǔ)路徑(比如SD卡中)的圖片,都需要借助于BitmapFactory來(lái)解析、創(chuàng)建Bitmap對(duì)象。一使用簡(jiǎn)單圖片動(dòng)手例子:

查看/assets/目錄下圖片的查看器

對(duì)應(yīng)項(xiàng)目android_06_ImageAssetsViewExample

二繪圖除了使用已有的圖片之外,Android應(yīng)用常需要在運(yùn)行時(shí)動(dòng)態(tài)地生成圖片,比如手機(jī)游戲的界面。這就需要借助于Android的繪圖支持。Android的繪圖應(yīng)該繼承View組件,并重寫(xiě)它的onDraw(Canvascanvas)方法即可。重寫(xiě)onDraw(Canvascanvas)方法時(shí)涉及一個(gè)繪圖API:Canvas,Canvas代表了View使用的畫(huà)布,它提供了以下各種方法繪制圖形二繪圖方法簽名簡(jiǎn)要說(shuō)明drawArc(RectFoval,floatstartAngle,floatsweepAngle,booleanuseCenter,Paintpaint)繪制弧drawBitmap(Bitmapbitmap,Rectsrc,Rectdst,Paintpaint)在指定點(diǎn)繪制從源位圖中”挖取“的部分drawBitmap(Bitmapbitmap,floatleft,floattop,Paintpaint)在指定點(diǎn)繪制位圖drawCircle(floatcx,floatcy,floatradius,Paintpaint)在指定點(diǎn)繪制圓形drawLine(floatstartX,floatstartY,floatstopX,floatstopY,Paintpaint)繪制一條線drawLines(float[]pts,intoffset,intcount,Paintpaint)繪制多條線drawOval(RectFoval,Paintpaint)繪制橢圓drawPath(Pathpath,Paintpaint)沿著指定Path繪制任意形狀二繪圖方法簽名簡(jiǎn)要說(shuō)明drawPoint(floatx,floaty,Paintpaint)繪制一個(gè)點(diǎn)drawPoints(float[]pts,intoffset,intcount,Paintpaint)繪制多個(gè)點(diǎn)drawRect(floatleft,floattop,floatright,floatbottom,Paintpaint)繪制矩形drawRoundRect(RectFrect,floatrx,flostry,Paintpaint)繪制圓角矩形drawText(Stringtext,intstart,intend,Paintpaint)繪制字符串drawTextOnPath(Stringtext,Pathpath,floathOffset,floatvOffset,Paintpaint)沿著路徑繪制字符串clipRect(floatleft,floattop,floatright,floatbottom)剪切一個(gè)矩形區(qū)域clipRegion(Region)剪切指定區(qū)域二繪圖除了前面定義的各種方法之外,Canvas還提供了如下方法進(jìn)行變換rotate(floatdegrees,floatpx,floatpy):對(duì)Canvas執(zhí)行旋轉(zhuǎn)scale(floatsx,floatpx,floatpy):對(duì)Canvas執(zhí)行縮放translate(floatdx,floatdy):移動(dòng)Canvas.向右移動(dòng)dx距離(dx為負(fù)即為向左移動(dòng)):向下移動(dòng)dy距離(dy為負(fù)即為向上移動(dòng))。二繪圖Canvas提供的上面的方法還涉及一個(gè)API:Paint,Paint代表了Canvas上的畫(huà)筆,因此Paint類(lèi)主要用于設(shè)置繪制風(fēng)格,包括畫(huà)筆顏色、畫(huà)筆筆觸粗細(xì)、填充風(fēng)格等。Paint提供了如下方法二繪圖方法簽名簡(jiǎn)要說(shuō)明setARGB(inta,intr,intg,intb)/setColor(intcolor)設(shè)置顏色setAlpha(inta)設(shè)置透明度setAntiAlias(booleanaa)設(shè)置是否抗鋸齒setPathEffect(PathEffecteffect)設(shè)置繪制路徑時(shí)的路徑效果setShader(Shadershader)設(shè)置畫(huà)筆的填充效果setShadowLayer(floatradius,floatdx,floatdy,intcolor)設(shè)置陰影setStrokeWidth(floatwidht)設(shè)置畫(huà)筆的筆觸寬度setStrokeJoin(PaintJointjoin)設(shè)置畫(huà)筆拐彎處的連接風(fēng)格setStyle(Paint.Stylestyle)設(shè)置Paint的填充風(fēng)格setTextAlign(Paint.Alignalign)設(shè)置繪制文本時(shí)的文字的對(duì)齊方式setTextSize(floattextSize)設(shè)置繪制文本時(shí)的文字大小二繪圖在Canvas提供的繪制方法中還用到一個(gè)API:Path,Path代表任意多條直線連接而成的任意圖形,當(dāng)Canvas根據(jù)Path繪制時(shí),它可以繪制出任意的形狀。二繪畫(huà)動(dòng)手例子:

繪制基本的集合圖形

對(duì)應(yīng)項(xiàng)目android_06_DrawSomethingExample

關(guān)鍵部分

自定義View組件,程序重寫(xiě)該View組件的onDraw(Canvas)方法

二繪圖Path類(lèi)從前面的程序可以看出,Android提供的Path是一個(gè)非常有用的類(lèi),它可以預(yù)先在View上將N個(gè)點(diǎn)連成一條”路徑“,然后調(diào)用Canvas的drawPath(path,paint)即可沿著路徑繪制圖形。實(shí)際上Android還為路徑繪制提供了PathEffect來(lái)定義繪制效果,PathEffect包含了如下子類(lèi)(每個(gè)子類(lèi)代表一種繪制效果):

ComposePathEffectCornerPathEffectDashPathEffectDiscretePathEffectPathDashPathEffectSumPathEffect二繪畫(huà)動(dòng)手例子:

*使用不同效果繪制路徑

對(duì)應(yīng)項(xiàng)目android_06_DrawPathExample

二繪圖除此之外,Android的Canvas還提供了一個(gè)drawTextOnPath(Stringtext,Pathpath,floathOffset,floatvOffset,Paintpaint)方法,該方法可以沿著Path繪制文本。其中hOffset參數(shù)指定水平偏移、vOffset參數(shù)指定垂直偏移。二繪畫(huà)動(dòng)手例子:*對(duì)應(yīng)Path路徑繪制文本

對(duì)應(yīng)項(xiàng)目android_06_DrawTextOnPathExample

二繪圖繪制游戲動(dòng)畫(huà)

掌握了Canvas繪畫(huà)后,如果需要實(shí)現(xiàn)游戲動(dòng)畫(huà)也是非常簡(jiǎn)單的。動(dòng)畫(huà)其實(shí)就是不斷地重復(fù)調(diào)用View組件的onDraw(Canvascanvas)方法,如果每次在View組件上繪制的圖形并不相同,就形成動(dòng)畫(huà)二繪圖繪制游戲動(dòng)畫(huà)

為了讓View組件上繪制的圖形發(fā)生改變(無(wú)非是位置、大小、角度等發(fā)生改變),這就需要程序記住這些狀態(tài)數(shù)據(jù)--如果需要游戲動(dòng)畫(huà)隨用戶(hù)操作而改變,就為用戶(hù)動(dòng)作編寫(xiě)事件監(jiān)聽(tīng)器,在監(jiān)聽(tīng)器中修改數(shù)據(jù);如果需要游戲動(dòng)畫(huà)“自動(dòng)”改變,就需要使用定時(shí)器(Timer),讓Timer控制這些狀態(tài)數(shù)據(jù)定期修改二繪圖繪制游戲動(dòng)畫(huà)

不管使用哪種方式,每次View組件上的圖形狀態(tài)數(shù)據(jù)發(fā)生了改變,都應(yīng)該通知View組件重寫(xiě)調(diào)用onDraw(Canvascanvas)方法重繪該組件。通知View重繪可調(diào)用invalidate(在UI線程中)或postInvalidate(在非UI線程中)二繪畫(huà)動(dòng)手例子:

彈球?qū)?yīng)項(xiàng)目android_06_BumpBallExample

二繪畫(huà)繪制游戲動(dòng)畫(huà)本示例要實(shí)現(xiàn)一個(gè)畫(huà)圖板,當(dāng)用戶(hù)在觸摸屏上移動(dòng)時(shí),即可在屏幕上繪制任意的圖形動(dòng)手例子:DrawSomething對(duì)應(yīng)項(xiàng)目android_06_DrawSomethingAnimationExample

二繪畫(huà)思考:1怎么使用戶(hù)在觸摸屏上自由的畫(huà)曲線?2每次OnDraw重繪時(shí),原有的內(nèi)容會(huì)丟失,怎么解決?

二繪畫(huà)思考:1怎么使用戶(hù)在觸摸屏上自由的畫(huà)曲線?

實(shí)際上利用drawLine來(lái)畫(huà)直線,每條直線都是從上一次拖動(dòng)事件發(fā)生點(diǎn)畫(huà)到本次拖動(dòng)事件發(fā)生點(diǎn)。當(dāng)用戶(hù)在觸摸屏上移動(dòng)時(shí),兩次拖動(dòng)事件發(fā)生的距離很小,多條極短的直線連起來(lái),看起來(lái)就是曲線了。借助于Android提供的Path類(lèi),可以非常方便地實(shí)現(xiàn)這種效果。2每次OnDraw重繪時(shí),原有的內(nèi)容會(huì)丟失,怎么解決?

當(dāng)程序需要在指定View上進(jìn)行繪制時(shí),程序并不直接繪制到該View組件上,而是先繪制到一個(gè)內(nèi)存中的Bitmap圖片,等到內(nèi)存中的Bitmaip繪制好后,在一次性將Bitmap繪制到View組件上

,也就是所謂的“雙緩沖”技術(shù)三圖形特效處理(Matrix)Andoird除了前面介紹的這些圖形支持外,還提供了一些額外的圖形特效支持,如Matrix三圖形特效處理(Matrix)Matrix是Android提供的一個(gè)矩陣工具類(lèi),它本身并不能對(duì)圖像或組件進(jìn)行變換,但它可與其他API結(jié)合來(lái)控制圖形、組件的變換使用Matrix控制圖像或組件的步驟如下。1獲取Matrix對(duì)象,該Matrix對(duì)象即可新創(chuàng)建,也可直接獲取其他對(duì)象內(nèi)封裝的Matrix(例如Transformation對(duì)象內(nèi)部就封裝了Matrix)。2調(diào)用Matrix的方法進(jìn)行平移、旋轉(zhuǎn)、縮放、傾斜等3將程序?qū)atrix所做的變換應(yīng)用到指定圖像或組件三圖形特效處理(Matrix)Matrix不僅可用于控制圖形的平移、旋轉(zhuǎn)、縮放、傾斜變換,也可以控制View組件進(jìn)行平移、旋轉(zhuǎn)和縮放等。三圖形特效處理(Matrix)Matrix提供了如下方法來(lái)控制平移、旋轉(zhuǎn)和縮放setTranslate(floatdx,floatdy):控制Matrix進(jìn)行平移setRotate(floatdegrees,floatpx,floatpy):設(shè)置以px、py為軸心進(jìn)行旋轉(zhuǎn),degrees為控制旋轉(zhuǎn)的角度setScale(floatsx,floatsy,floatpx,floatpy):設(shè)置Matrix以px、py為軸心進(jìn)行縮放,sx、sy控制了X、Y方向上的縮放比例setSkew(floatkx,floatky,floatpx,floatpy):控制Matrix以px、py為軸心進(jìn)行傾斜。kx、ky為x、y方向上的傾斜距離。三圖形特效處理(Matrix)一旦對(duì)Matrix進(jìn)行了變換,接下來(lái)就可應(yīng)用該Matrix對(duì)圖形進(jìn)行控制了。例如Canvas就提供了一個(gè)drawBitmap(Bitmapbitmap,Matrixmatrix,Paintpaint)方法,調(diào)用該方法就可以在繪制bitmap時(shí)應(yīng)用Matrix上的變換三圖形特效處理(Matrix)動(dòng)手例子:

鍵盤(pán)控制圖形進(jìn)行Matrix變換(上下鍵縮放,左右鍵傾斜)對(duì)應(yīng)項(xiàng)目android_06_KeyboardMatrixExample三圖形特效處理(Matrix)動(dòng)手例子:

飛機(jī)”向上“飛行(通過(guò)控制背景圖片下移)

對(duì)應(yīng)項(xiàng)目android_06_PlaneMoveBackExample四逐幀動(dòng)畫(huà)逐幀(Frame)是最容易理解的動(dòng)畫(huà),開(kāi)發(fā)者把動(dòng)畫(huà)過(guò)程的每張靜態(tài)圖片都收集起來(lái),然后由Android來(lái)控制依次顯示這些靜態(tài)圖片,利用人眼“視覺(jué)暫留”的原理,給用戶(hù)造成“動(dòng)畫(huà)”的錯(cuò)覺(jué)。逐幀動(dòng)畫(huà)的動(dòng)畫(huà)原理與放電影的原理完全一樣。四AnimationDrawable與逐幀動(dòng)畫(huà)定義逐幀動(dòng)畫(huà)非常簡(jiǎn)單,只要在<animation-list.../>元素中使用<item.../>子元素定義動(dòng)畫(huà)的全部幀,并指定各幀的持續(xù)時(shí)間即可。定義逐幀動(dòng)畫(huà)的語(yǔ)法格式如下:<?xmlversion="1.0"encoding="utf-8"?><animation-listxmlns:android=/apk/res/androidandroid:oneshot=["true"|"false"]><itemandroid:drawable="@[package:]drawable/drawable_resource_name"android:duration="integer"/></animation-list>四AnimationDrawable與逐幀動(dòng)畫(huà)上面的語(yǔ)法格式中android:onshot控制該動(dòng)畫(huà)是否循環(huán)播放,如果該參數(shù)指定為true,則動(dòng)畫(huà)將不會(huì)循環(huán)播放;否則該動(dòng)畫(huà)將會(huì)循環(huán)播放。每個(gè)<item.../>子元素添加一幀。四AnimationDrawable與逐幀動(dòng)畫(huà)Android完全支持在Java代碼中創(chuàng)建逐幀動(dòng)畫(huà),如果開(kāi)發(fā)者喜歡,開(kāi)發(fā)者完全可以先創(chuàng)建AnimationDrawable對(duì)象,然后調(diào)用addFrame(Drawableframe,intduration)向該動(dòng)畫(huà)中添加幀,每調(diào)用一次addFrame方法,就向<animation-list.../>元素中添加一個(gè)<item.../>子元素。四AnimationDrawable與逐幀動(dòng)畫(huà)一旦程序獲取了AnimationDrawable對(duì)象之后,接下來(lái)就可用ImageView把AnimationDrawable顯示出來(lái)---習(xí)慣上把AnimationDrawable設(shè)成ImageView的背景即可。四AnimationDrawable與逐幀動(dòng)畫(huà)動(dòng)手例子:

控制動(dòng)畫(huà)的播放和停止對(duì)應(yīng)項(xiàng)目android_06_FrameAnimationExample關(guān)鍵代碼(res\anim\fat_po.xml)<animation-listxmlns:android="/apk/res/android"android:oneshot="false"><itemandroid:drawable="@drawable/fat_po_f01"android:duration="60"/><itemandroid:drawable="@drawable/fat_po_f02"android:duration="60"/></animation-list>四AnimationDrawable與逐幀動(dòng)畫(huà)需要指出的是,AnimationDrawable代表的動(dòng)畫(huà)默認(rèn)是不播放的,必須在程序中啟動(dòng)動(dòng)畫(huà)播放才可以。AnimationDrawable提供了如下兩個(gè)方法來(lái)開(kāi)始、停止動(dòng)畫(huà)。start():開(kāi)始播放動(dòng)畫(huà)。stop():停止播放動(dòng)畫(huà)。四AnimationDrawable與逐幀動(dòng)畫(huà)動(dòng)手例子:

在指定點(diǎn)爆炸對(duì)應(yīng)項(xiàng)目android_06_BlastFrameAnimationExample四AnimationDrawable與逐幀動(dòng)畫(huà)前面介紹“雷電”飛機(jī)游戲時(shí)已經(jīng)提到,當(dāng)敵機(jī)與用戶(hù)自己的飛機(jī)碰撞、或者自己的飛機(jī)發(fā)射的子彈與敵機(jī)碰撞時(shí),都應(yīng)該在碰撞點(diǎn)播放“飛機(jī)爆炸”的動(dòng)畫(huà)。

爆炸效果實(shí)際上是一個(gè)逐幀動(dòng)畫(huà),開(kāi)發(fā)者需要收集從開(kāi)始爆炸到爆炸結(jié)束的所有靜態(tài)圖片,再將這些圖片定義成一個(gè)逐幀動(dòng)畫(huà),接著在碰撞點(diǎn)播放該逐幀動(dòng)畫(huà)即可。

本示例為了突出此處的“主題”---在指定點(diǎn)爆炸,并未增加飛機(jī)控制這些細(xì)節(jié),只是簡(jiǎn)單地檢測(cè)觸摸屏事件,當(dāng)用戶(hù)觸摸觸摸屏?xí)r,程序?qū)?huì)在觸碰點(diǎn)“爆炸”。五補(bǔ)間(Tween)動(dòng)畫(huà)Android除了支持逐幀動(dòng)畫(huà)之外,也提供了對(duì)補(bǔ)間(Tween)動(dòng)畫(huà)的支持,補(bǔ)間動(dòng)畫(huà)就是開(kāi)發(fā)者只需要指定動(dòng)畫(huà)開(kāi)始、動(dòng)畫(huà)結(jié)束“關(guān)鍵幀”,而動(dòng)畫(huà)變化的“中間幀”由系統(tǒng)計(jì)算、并補(bǔ)齊。五補(bǔ)間(Tween)動(dòng)畫(huà)補(bǔ)間動(dòng)畫(huà)所定義的開(kāi)始幀、結(jié)束幀其實(shí)只是一些簡(jiǎn)單的變化。比如圖形大小的縮放、旋轉(zhuǎn)角度的改變等。Android使用Animation代表抽象的動(dòng)畫(huà)類(lèi),它包括如下幾個(gè)子類(lèi)。AlphaAnimation:透明度改變的動(dòng)畫(huà)。創(chuàng)建該動(dòng)畫(huà)時(shí)要指定動(dòng)畫(huà)開(kāi)始的透明度、結(jié)束時(shí)的透明度和動(dòng)畫(huà)的持續(xù)時(shí)間。其中透明度可從0變化到1ScaleAnimation:大小縮放的動(dòng)畫(huà)。創(chuàng)建該動(dòng)畫(huà)時(shí)需要指定動(dòng)畫(huà)開(kāi)始時(shí)的縮放比(以X、Y軸的縮放參數(shù)來(lái)表示)、結(jié)束時(shí)動(dòng)畫(huà)的縮放比(以X、Y軸的縮放參數(shù)來(lái)表示),并指定動(dòng)畫(huà)持續(xù)時(shí)間。由于縮放時(shí)以不同點(diǎn)為中心縮放效果并不相同,因此指定縮放動(dòng)畫(huà)時(shí)還要通過(guò)pivotX、privotY來(lái)指定縮放中心的坐標(biāo)五補(bǔ)間(Tween)動(dòng)畫(huà)TranslateAnimation:位移變化的動(dòng)畫(huà),創(chuàng)建該動(dòng)畫(huà)時(shí)只要指定動(dòng)畫(huà)開(kāi)始時(shí)的位置(以X、Y坐標(biāo)來(lái)表示)、結(jié)束時(shí)的位置(以X、Y坐標(biāo)來(lái)表示),并指定動(dòng)畫(huà)持續(xù)時(shí)間即可RotateAnimation:旋轉(zhuǎn)動(dòng)畫(huà),創(chuàng)建該動(dòng)畫(huà)時(shí)只要指定動(dòng)畫(huà)開(kāi)始時(shí)的旋轉(zhuǎn)角度、結(jié)束時(shí)的旋轉(zhuǎn)角度,并制定動(dòng)畫(huà)持續(xù)時(shí)間即可。由于旋轉(zhuǎn)時(shí)以不同點(diǎn)為中心旋轉(zhuǎn)效果并不相同,因此指定旋轉(zhuǎn)動(dòng)畫(huà)時(shí)還要通過(guò)pivotX、pivotY來(lái)指定“旋轉(zhuǎn)軸心”的坐標(biāo)五補(bǔ)間(Tween)動(dòng)畫(huà)一旦為補(bǔ)間動(dòng)畫(huà)指定了3個(gè)必要信息,Android就會(huì)根據(jù)動(dòng)畫(huà)的開(kāi)始幀、結(jié)束幀、動(dòng)畫(huà)持續(xù)時(shí)間計(jì)算出需要在中間“補(bǔ)入”多少幀,并計(jì)算所有補(bǔ)入幀的圖形。當(dāng)用戶(hù)瀏覽補(bǔ)間動(dòng)畫(huà)時(shí),他看到的依然是“逐幀動(dòng)畫(huà)”

為了控制在動(dòng)畫(huà)期間需要?jiǎng)討B(tài)“補(bǔ)入”多少幀,具體在動(dòng)畫(huà)運(yùn)行的那些時(shí)刻補(bǔ)入幀,需要借助于Interpolator。五補(bǔ)間(Tween)動(dòng)畫(huà)

Interpolator根據(jù)特定算法計(jì)算出整個(gè)動(dòng)畫(huà)所需要?jiǎng)討B(tài)插入幀的密度和位置,簡(jiǎn)單地說(shuō),Interpolator負(fù)責(zé)控制動(dòng)畫(huà)的變化速度,這就使得基本的動(dòng)畫(huà)效果(Alpha、Scale、Translate、Rotate)能以勻速變化、加速、減速、拋物線速度等各種速度變化。Interpolator是一個(gè)接口,它定義了搜有Interpolator都需要實(shí)現(xiàn)的方法:floatgetInterpolation(floatinput),開(kāi)發(fā)者完全可以通過(guò)實(shí)現(xiàn)Interpolator來(lái)控制動(dòng)畫(huà)的變化速度。五補(bǔ)間(Tween)動(dòng)畫(huà)

Android為Interpolator提供了如下幾個(gè)實(shí)現(xiàn)類(lèi),分別用于實(shí)現(xiàn)不同動(dòng)畫(huà)變化速度。LinearInterpolator:動(dòng)畫(huà)以均勻的速度改變AccelerateInterpolator:在動(dòng)畫(huà)開(kāi)始的地方改變速度較慢,然后開(kāi)始加速。AccelerateDecelerateInterpolator:在動(dòng)畫(huà)開(kāi)始、結(jié)束的地方改變速度較慢,在中間的時(shí)候加速CycleInterpolator:動(dòng)畫(huà)循環(huán)播放特定的次數(shù),變化速度按正弦曲線改變DecelerateInterpolator:在動(dòng)畫(huà)開(kāi)始的地方改變速度較快,然后開(kāi)始減速。五補(bǔ)間(Tween)動(dòng)畫(huà)為了在動(dòng)畫(huà)資源文件中指定補(bǔ)間動(dòng)畫(huà)所使用的Interpolator,定義補(bǔ)間動(dòng)畫(huà)的<set.../>元素支持一個(gè)android:interpolator屬性,該屬性的屬性值可指定為Android默認(rèn)支持的Interpolator.

例如:@android:anim/linear_interpolator@android:anim/accelerate_interpolator@android:anim/decelerate_interpolator其實(shí)上面的寫(xiě)法很有規(guī)律,他們就是把系統(tǒng)提供的Interpolator實(shí)現(xiàn)類(lèi)的類(lèi)名的駝峰寫(xiě)法改為中劃線寫(xiě)法即可。五補(bǔ)間(Tween)動(dòng)畫(huà)一旦在程序中通過(guò)AnimationUtils得到代表補(bǔ)間動(dòng)畫(huà)的Animation之后,接下來(lái)就可調(diào)用View的startAnimation(Animationanim)方法開(kāi)始對(duì)View執(zhí)行動(dòng)畫(huà)了。雖然Android允許在程序中創(chuàng)建Animation對(duì)象,但實(shí)際上一般都會(huì)采用動(dòng)畫(huà)資源文件來(lái)定義補(bǔ)間動(dòng)畫(huà)五補(bǔ)間(Tween)動(dòng)畫(huà)一旦在程序中通過(guò)AnimationUtils得到代表補(bǔ)間動(dòng)畫(huà)的Animation之后,接下來(lái)就可調(diào)用View的startAnimation(Animationanim)方法開(kāi)始對(duì)View執(zhí)行動(dòng)畫(huà)了。雖然Android允許在程序中創(chuàng)建Animation對(duì)象,但實(shí)際上一般都會(huì)采用動(dòng)畫(huà)資源文件來(lái)定義補(bǔ)間動(dòng)畫(huà)五補(bǔ)間

溫馨提示

  • 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ù)網(wǎng)僅提供信息存儲(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)論