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