亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Android游戲開(kāi)發(fā)十四】深入Animation,在Surfa

系統(tǒng) 2339 0

Himi 原創(chuàng), 轉(zhuǎn)載請(qǐng)注明! 謝謝。

原文地址: http://blog.csdn.net/xiaominghimi/archive/2011/01/04/6116089.aspx

之前在【Android2D游戲開(kāi)發(fā)之四】中我給大家介紹了一張13幀的png的圖,利用設(shè)置可視區(qū)域的方式來(lái)實(shí)現(xiàn)動(dòng)畫(huà)效果,但是這些屬于我們自己來(lái)實(shí)現(xiàn)動(dòng)畫(huà)的方式,其實(shí)Android給我們的有兩類自定義動(dòng)畫(huà)方式:

第一類:Frame By Frame 幀動(dòng)畫(huà) ( 不推薦游戲開(kāi)發(fā)中使用)

所謂幀動(dòng)畫(huà),就是順序播放事先做好的圖像,類似于放電影;

分析: 此種方式類似我之前的那種利用設(shè)置可視區(qū)域的方式來(lái)實(shí)現(xiàn)動(dòng)畫(huà)效果,不僅類似而且還不如!所以此種方式在此不予分析;

第二類:Tween Animation 漸變動(dòng)畫(huà)

即通過(guò)對(duì)對(duì)象不斷做圖像變換 ( 平移、縮放、旋轉(zhuǎn) ) 產(chǎn)生動(dòng)畫(huà)效果!實(shí)現(xiàn)方式其實(shí)就是預(yù)先定義一組指令,這些指令指定了圖形變換的類型、觸發(fā)時(shí)間、持續(xù)時(shí)間。這些指令可以是以 XML 文件方式定義,也可以是以源代碼方式定義。程序沿著時(shí)間線執(zhí)行這些指令就可以實(shí)現(xiàn)動(dòng)畫(huà) 效果。

總結(jié): 那么在Android 游戲開(kāi)發(fā)中我們優(yōu)先選用兩種方式:第一種設(shè)置可視區(qū)域的方式來(lái)實(shí)現(xiàn)動(dòng)畫(huà)效果(幀動(dòng)畫(huà)),需要童鞋們手動(dòng)實(shí)現(xiàn),那么在之前我的博文【Android2D游戲開(kāi)發(fā)之四】中已經(jīng)有了相應(yīng)的源碼!大家可以去下載研究;那么這里就主要為大家詳細(xì)分析 Tween Animation!

在講述SurfaceView添加動(dòng)畫(huà)之前,我們先來(lái)看看在View中如何實(shí)現(xiàn)TweenAnimation以及Tween 中的四種效果;

MyViewAnimation .java


補(bǔ)充:有童鞋說(shuō)對(duì)三種相對(duì)位置不太理解,那么我簡(jiǎn)單說(shuō)補(bǔ)充下:

// Animation.ABSOLUTE 相對(duì)位置是屏幕左上角 ,絕對(duì)位置! // Animation.RELATIVE_TO_SELF 相對(duì)位置是自身View;取值為0,是自身左上角,取值為1是自身的右下角; // Animation.RELATIVE_TO_PARENT 相對(duì)父類View的位置

當(dāng)設(shè)定了位置類型之后,會(huì)讓你傳入X或者Y的值,這里的X,Y可以理解成為一個(gè)點(diǎn)坐標(biāo)!比如是旋轉(zhuǎn)動(dòng)畫(huà),那么這個(gè)(X,Y)就是旋轉(zhuǎn)中心點(diǎn)!


OK,對(duì)于Tween Animation下的每種動(dòng)畫(huà)效果的實(shí)例化的每個(gè)參數(shù)都解釋的很詳細(xì)了!其實(shí)動(dòng)畫(huà)的實(shí)現(xiàn)不光用代碼可以實(shí)現(xiàn),在xml中注冊(cè)實(shí)現(xiàn)也是可以的,這里就不多寫(xiě)了,大家可以自己去嘗試寫(xiě)一下,那么在view中我們播放一種特效動(dòng)畫(huà),只要實(shí)例化其對(duì)象,然后設(shè)置下參數(shù),然后startAnimation()就好了,步驟很簡(jiǎn)單,只是每個(gè)動(dòng)畫(huà)實(shí)例化的參數(shù)確有著千變?nèi)f化的改法,這些我也沒(méi)法子一一來(lái)給大家演示,大家可以自己改改參數(shù)看看實(shí)際的效果!當(dāng)然對(duì)于每種動(dòng)畫(huà)我們不光有設(shè)置播放的時(shí)候,還有一些屬性和方法可以調(diào)用,比如Animation.restart()重放動(dòng)畫(huà), getTransformation()此方法返回 假,說(shuō)明動(dòng)畫(huà)完成等等很多屬性,請(qǐng)各位童鞋自定實(shí)驗(yàn) o(∩_∩)o 哈哈~

順便先解釋下MyViewAnimation .java 類中onDraw()方法里的 備注1) !其實(shí)這里我是想跟大家說(shuō)明下Android Animation實(shí)現(xiàn)機(jī)制

【啟動(dòng)任意一種動(dòng)畫(huà)效果之前 和 之后 的對(duì)比圖】

【Android游戲開(kāi)發(fā)十四】深入Animation,在SurfaceView中照樣使用Android—Tween Animation! 【Android游戲開(kāi)發(fā)十四】深入Animation,在SurfaceView中照樣使用Android—Tween Animation!

很明顯、"Himi"字樣在動(dòng)畫(huà)開(kāi)始前和開(kāi)始后出現(xiàn)了移動(dòng),而且在MyViewAnimation.java中我沒(méi)有使用Runnable接口,也沒(méi)有調(diào)用刷新的函數(shù),那么我來(lái)給各位童鞋解釋下原因:

動(dòng)畫(huà)的每種變換其實(shí)內(nèi)部都是一次矩陣運(yùn)算。在Android 中, Canvas 類中包含當(dāng)前矩陣,當(dāng)調(diào)用 Canvas.drawBitmap (bmp, x, y, Paint) 繪制時(shí), android 會(huì)先把 bmp 做一次矩陣運(yùn)算,然后將運(yùn)算的結(jié)果顯示在 Canvas 上,然后不斷修改 Canvas 的矩陣并刷新屏幕, View 里的對(duì)象就會(huì)不停的做圖形變換,動(dòng)畫(huà)就形成了。

還有一點(diǎn)提醒大家: 動(dòng)畫(huà)的播放是對(duì)整個(gè)游戲畫(huà)布進(jìn)行的操作,這一點(diǎn)要知道喲~

那么下面就要給大家介紹如何在我們的SurfaceView中運(yùn)用Tween Animation!


MySurfaceViewAnimation.java

動(dòng)畫(huà)代碼實(shí)現(xiàn)跟View中的做法一樣,運(yùn)行模擬器發(fā)現(xiàn)按鍵沒(méi)效果,不是按鍵沒(méi)觸發(fā)是本來(lái)就存在問(wèn)題, - -。但是!大家可以把此類里有一行,也就是 (備注2) 的注釋打開(kāi),我們給設(shè)置背景圖,然后在模擬器上的運(yùn)行效果如下圖:

【Android游戲開(kāi)發(fā)十四】深入Animation,在SurfaceView中照樣使用Android—Tween Animation!

很明顯的看到,我們的動(dòng)畫(huà)正常運(yùn)行了,雖然效果并不是我們想到的!但是這里可以說(shuō)明一點(diǎn)問(wèn)題:

SurfaceView 本身具備雙緩沖機(jī)制!!!!!

有些文章里說(shuō)“給SurfaceView添加雙緩沖”,其實(shí)是在畫(huà)蛇添足 - -,而且介紹的時(shí)候拿著單線程與雙線程例子來(lái)解釋雙緩沖更高效的實(shí)現(xiàn)方法;我想弱弱的問(wèn)什么是雙緩沖??? 如果SurfaceView不具備雙緩沖,那敢問(wèn)上面這張截圖如何解釋????

其實(shí)要實(shí)現(xiàn)雙緩沖,只需要是新建一個(gè)Bitmap和Canvas,用這個(gè)新建的Canvas把正弦波畫(huà)到新建的Bitmap,畫(huà)完再通過(guò)sfh.lockCanvas獲取SurfaceView對(duì)應(yīng)的Canvas,用這個(gè)Canvas把新建的Bitmap畫(huà)到SurfaceView上去,這才叫雙緩沖; 還有雙緩存和多線程沒(méi)關(guān)系!

那么View中動(dòng)畫(huà)的實(shí)現(xiàn)機(jī)制是在不斷的刷屏不斷的重復(fù)調(diào)用重寫(xiě)的onDraw()方法、而在Surfaceview的那張截圖確實(shí)也正常的動(dòng)畫(huà)操作了,原因又何在?而且我們?cè)O(shè)置的背景圖覆蓋我們draw出來(lái)的字體?。⌒Ч懿焕硐?;那么經(jīng)過(guò)考慮我決定利用布局把View和SurfaceView都一并顯示,用View主要去完成動(dòng)畫(huà)部分,(那么關(guān)于如何一并顯示,或者說(shuō)同時(shí)在SurfaceView中添加組件,在之前的【Android 2D開(kāi)發(fā)之六】 和【Android 2D開(kāi)發(fā)之七】都有了詳細(xì)講解,那么在這里),當(dāng)然一并顯示也會(huì)有問(wèn)題,比如我們存在了view和Surfaceiew,那么按鍵的時(shí)候觸發(fā)的哪個(gè)?或者說(shuō)如何去控制這兩個(gè)View?放心,我下面就跟大家一一來(lái)講解!

下面先讓我們把我們的view 和 Surfaceview 先同時(shí)顯示出來(lái):【 黑色的是MyView (View),白色是MySurfaceView(SurfaceView)

先上張運(yùn)行截圖: (圖4)


【Android游戲開(kāi)發(fā)十四】深入Animation,在SurfaceView中照樣使用Android—Tween Animation!

main.xml中的代碼

xml中我們注冊(cè)了我們自定義的view-MyView 和 SurfaceView-MySurfaceView;

需要強(qiáng)調(diào)的有兩點(diǎn):

1 : 當(dāng)我們xml中注冊(cè)我們的View時(shí),我們View類中的構(gòu)造函數(shù)必須要用

public MyView(Context context, AttributeSet attrs) {} 兩個(gè)參數(shù)的形式,以前的文章有講解。

2 : 當(dāng)我們?cè)赬ml中注冊(cè)兩個(gè)View的時(shí)候,它們顯示的次序就是根據(jù)xml注冊(cè)的順序來(lái)顯示,比如上面我們先注冊(cè)了 MySurfaceView, 然后注冊(cè)的 MyView ,那么顯示的時(shí)候會(huì)把后添加進(jìn)去的MyView顯示在最上層!

下面我們來(lái)看MySurfaceView.java中的代碼:

代碼都很熟悉了, 主要我們來(lái)給大家解釋下 備注1,備注2:

備注1:

我在兩個(gè)MyView 和 MySurfaceView中都定義了本類一個(gè)靜態(tài)對(duì)象,然后在初始化的時(shí)候都利用 =this 的形式進(jìn)行了實(shí)例化;

注意:=this; 的這種實(shí)例形式要注意!只能在當(dāng)前程序中僅存在一個(gè)本類對(duì)象才可使用!

為什么要實(shí)例兩個(gè)View的實(shí)例而且定義成靜態(tài),這樣做主要為了類之間方便調(diào)用和操作!比如在我們這個(gè)項(xiàng)目中,我這樣做是為了在MainActivity中去管理兩個(gè)View按鍵焦點(diǎn)!下面我會(huì)給出MainActivity的代碼,大家一看便知;

備注2:

我在兩個(gè)MyView 和 MySurfaceView中都對(duì)獲取按鍵焦點(diǎn)注釋掉了,而是在別的類中的調(diào)用其View的靜態(tài)實(shí)例對(duì)象就可以任意類中對(duì)其設(shè)置!這樣就可以很容易去控制到底誰(shuí)來(lái)響應(yīng)按鍵了。

這里還要強(qiáng)調(diào)一下:當(dāng)xml中注冊(cè)多個(gè) View的時(shí)候,當(dāng)我們點(diǎn)擊按鍵之后,Android會(huì)先判定哪個(gè)ViewsetFocusable(true)設(shè)置焦點(diǎn)了,如果都設(shè)置了,那么Android 會(huì)默認(rèn)響應(yīng)在xml中第一個(gè)注冊(cè)的view ,而不是兩個(gè)都會(huì)響應(yīng)。那么為什么不同時(shí)響應(yīng)呢?我解釋下:

上面這截圖是Android SDK Api的樹(shù)狀圖,很明顯SurfaceView繼承了View,它倆是基繼承關(guān)系,那么不管是子類還是基類一旦響應(yīng)了按鍵,其基類或者父類就不會(huì)再去響應(yīng);

下面我們來(lái)看MainActivity.java:

備注1:

這里是當(dāng)程序運(yùn)行的時(shí)候我們默認(rèn)讓我們的MyView(View)來(lái)響應(yīng)按鍵。通過(guò)類名調(diào)用對(duì)應(yīng)的View實(shí)例,然后設(shè)置獲取焦點(diǎn)的函數(shù);

備注2:

這里要注意:不管你在xml中注冊(cè)了多少個(gè)View ,也不管View是否都設(shè)置了獲取焦點(diǎn),只要你在 MainActivity 中重寫(xiě)onKeyDown()函數(shù),Android 就會(huì)調(diào)用此函數(shù)。

那么直接在SurfaceView中進(jìn)行實(shí)現(xiàn)動(dòng)畫(huà)的想法這里沒(méi)有得到很好的解決,而是我利用布局的方式來(lái)一同顯示的方式,希望各位童鞋如果有好的方法,在SurfaceView中直接能使用動(dòng)畫(huà)的建議和想法,希望留言給我,大家一起學(xué)習(xí) 討論,謝謝 下面給出項(xiàng)目源碼:

源碼下載地址: http://download.csdn.net/source/2969602

(歡迎各位童鞋訂閱本博客,因?yàn)樵鄣母滤俣瓤墒呛芸斓膥娃哈哈)



【Android游戲開(kāi)發(fā)十四】深入Animation,在SurfaceView中照樣使用Android—Tween Animation!


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!?。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日本不卡在线一区二区三区视频 | 中文精品99久久国产 | 狠狠色丁香久久婷婷 | 亚洲精品视频一区二区 | 国产成人精品2021欧美日韩 | 亚洲va欧美va国产va天堂影 | 无遮挡无遮挡91桃色在线观看 | 国产欧美在线观看一区二区 | 久久伊人中文字幕 | 国产成人精品本亚洲 | 亚洲图片 欧美 | 青青青国产免费线在 | 日韩一级黄色录像 | 天天摸天天舔天天操 | 天天玩天天操 | 国产福利免费 | 国产乱人伦偷精品视频不卡 | 久久久久国产精品免费免费 | 国产一区二区三区在线影院 | 台湾一级毛片免费播放 | 四虎永久网站 | 精品少妇一区二区三区视频 | 国产中文字幕一区 | 久久久999国产精品 久久久999久久久精品 | 中文字幕一区二区在线视频 | 久久99精品国产麻豆 | 亚洲精品日韩在线一区 | 337p色噜噜人体大胆欧美 | 久久综合九色综合欧洲 | 国产成人一区二区三区 | 九九视频免费在线观看 | 狠狠色丁香婷婷综合激情 | 国产一区二区免费 | 亚洲天天更新 | 久久综合图区亚洲综合图区 | 99久久国产综合色 | 欧美在线一区二区三区 | 亚洲国产综合自在线另类 | 久久香蕉网| 亚洲精品综合一区在线 | 天天射天天射天天射 |