1.粒子動(dòng)畫的開(kāi)源實(shí)現(xiàn)
其實(shí)所有的游戲引擎都支持粒子效果,但是在標(biāo)準(zhǔn)的安卓UI中沒(méi)有這個(gè)東西。也就是說(shuō)如果你像創(chuàng)建一個(gè)具有粒子效果的app,你必須包含一個(gè)游戲引擎-高射炮打蒼蠅,或者自己寫一個(gè)。Leonids正好填補(bǔ)了這一空白。
2.View的動(dòng)畫實(shí)現(xiàn)原理
View要實(shí)現(xiàn)自定義動(dòng)畫,需要不斷的執(zhí)行onDraw()方法進(jìn)行繪制,每次執(zhí)行都對(duì)內(nèi)部顯示的圖形做一些調(diào)整,我們假設(shè) onDraw方法每秒執(zhí)行20次,這樣就會(huì)形成一個(gè)20幀的補(bǔ)間動(dòng)畫效果。但是現(xiàn)實(shí)情況是你無(wú)法簡(jiǎn)單的控制View.onDraw的執(zhí)行幀數(shù),因?yàn)閛nDraw方法是由系統(tǒng)幫我們調(diào)用的,我們是通過(guò)調(diào)用View的 invalidate方法通知系統(tǒng)需要重新繪制View,然后它就會(huì)調(diào)用View.onDraw方法。這些都是由系統(tǒng)幫我們實(shí)現(xiàn)的,所以我們很難精確去定 義View.onDraw的執(zhí)行幀數(shù)
這個(gè)就是為什么我們這邊要了解SurfaceView了,它能彌補(bǔ)View的一些不足。
3.SurfaceView相對(duì)于view的特色
SurfaceView可以控制動(dòng) 畫的幀數(shù)。在SurfaceView中內(nèi)置一個(gè)LoopThread線程,這個(gè)線程的作用就是用來(lái)繪制圖形,在SurfaceView中實(shí)例化一個(gè) LoopThread實(shí)例,一般這個(gè)操作會(huì)放在SurfaceView
的構(gòu)造方法中。然后通過(guò)在SurfaceView中的SurfaceHolder的 生命周期回調(diào)方法中插入一些操作,當(dāng)Surface被創(chuàng)建時(shí)(SurfaceView顯示在屏幕中時(shí)),開(kāi)啟LoopThread執(zhí)行繪 制,LoopThread會(huì)一直刷新SurfaceView對(duì)象,當(dāng)SurfaceView被隱藏時(shí)就停止改線程釋放資源。
注意點(diǎn):
1.因?yàn)镾urfaceView允許自定義的線程操作Surface對(duì)象執(zhí)行繪制方法,而你可能同時(shí)定義多個(gè)線程執(zhí)行繪制,所以當(dāng)你獲取 SurfaceHolder中的Canvas對(duì)象時(shí)記得加同步操作,避免兩個(gè)不同的線程同時(shí)操作同一個(gè)Canvas對(duì)象,當(dāng)操作完成后記得調(diào)SurfaceHolder.unlockCanvasAndPost方法釋放掉Canvas鎖。
2.在調(diào)用doDraw執(zhí)行繪制時(shí),因?yàn)镾urfaceView的特點(diǎn),它會(huì)保留之前繪制的圖形,所以你需要先清空掉上一次繪制時(shí)留下的圖形。(View則不會(huì),它默認(rèn)在調(diào)用View.onDraw方法時(shí)就自動(dòng)清空掉視圖里的東西)。
3. 記得在回調(diào)方法:onSurfaceDestroyed方法里將后臺(tái)執(zhí)行繪制的LoopThread關(guān)閉,這里是使用join方法。這涉及到線程
如何關(guān)閉 的問(wèn)題,多數(shù)人建議是通過(guò)一個(gè)標(biāo)志位:isRunning來(lái)判斷線程是否該停止運(yùn)行,如果你想關(guān)閉線程只需要將
isRunning改成false即可,線 程會(huì)自動(dòng)執(zhí)行完run方法后退出。
4.surfaceView與view的區(qū)別
1. SurfaceView允許其他線程更新視圖對(duì)象(執(zhí)行繪制方法)而View不允許這么做,它只允許UI線程更新視圖對(duì)象。
2. SurfaceView是放在其他最底層的視圖層次中,所有其他視圖層都在它上面,所以在它之上可以添加一些層,
而且它不能是透明的。
3. 它執(zhí)行動(dòng)畫的效率比View高,而且你可以控制幀數(shù)。
4. 因?yàn)樗亩x和使用比View復(fù)雜,占用的資源也比較多,除非使用View不能完成,再用SurfaceView否則最好
用View就可以。(貪吃蛇,俄羅斯方塊,棋牌類這種幀數(shù)比較低的可以使用View做就好)
5.SurfaceView中的回調(diào)方法
自定義SurfaceView的基本流程:
1、繼承SurfaceView
2、重寫SurfaceView的至少一個(gè)構(gòu)造方法
3、利用getHolder()方法得到SurfaceHolder的引用對(duì)象
4、給SurfaceHolder對(duì)象添加實(shí)現(xiàn)SurfaceHolder.Callback的接口對(duì)象
5、重寫Callback的三個(gè)方法:surfaceChanged,surfaceCreated,surfaceDestroyed
6、利用SurfaceHolder對(duì)象設(shè)置Surface的格式
通過(guò)SurfaceHolder來(lái)管理Surface,實(shí)現(xiàn)SurfaceHolder.Callback.surfaceCreated和SurfaceHolder.Callback.surfaceDestroyed方法可以跟蹤Surface被創(chuàng)建和銷毀的事件。
6.出現(xiàn)的問(wèn)題點(diǎn)
在關(guān)閉硬件加速的時(shí)候會(huì)出現(xiàn)其他控件后面有一大塊的白色背景
在放到其他視圖中使用自定義的surfaceview的時(shí)候一定要實(shí)現(xiàn)兩個(gè)參數(shù)的構(gòu)造器使用的時(shí)候盡量使用其他組視圖進(jìn)行包裹