SurfacView的使用及數據緩衝機制

最近在做一個項目,原來在手機運行非常流暢的代碼移植到平板電腦中,運行就感覺明顯很卡, 原因是平板電腦的分辨率是手機的兩倍,而CPU還遠達不到手機的兩倍。原來採用ViewGroup的形式,就不得采用繪製到Bitmap的做法, 繪製到Bitmap這種做法,已經成Android繪製各種特效的常規做法了。 但是繪製到Bitmap,相對ViewGroup有很多不足的地方: 1. 不靈活, 不像ViewGroup的形式,可以採用XML佈局的形式。ViewGroup做法的移植性相對來說更好些。 2.. 按鍵響應控制, 每個View都有自己的事件響應方法,而採用Bitamp繪製,不得根據區域來判斷響應事件。但是基於效率考慮,不得不採用在SurfaceView中用繪製Bitmap的方法,來達到無限制數量的左右滑動容器(類似gallery)的效果。 其實,目前android很多的應用都是採用這種方式來做的,比如所有流行的電子書閱讀界面。

       SurfaceView繪製效率高,就是Android 提供一個讓我們直接可以繪製的Buffer。

       控制SurfaceView的生命週期有三個函數 surfaceCreate,sufaceChange, surfaceDestroy. surfaceChange一般用於處理橫豎屏幕切換。

       我的做法是:

1. 創建一個繪製線程, 

ThreaddrawThread = new Thread {

       public void run () {

               do  {

                     // Canvas 繪製

                     // wait() 線程等待 .

              } while(true);                                

       }

}

2. 和手姿結合起來

3. 數據源綁定

   我是在onScroll 結束的時候和更新數據,而這些數據就是在繪製時候需要的bitmap. 一定不要再繪製線程做一些數據處理和數據獲得的耗時操作。

       數據的獲取是開另一個數據處理線程來做,目的是準備需要繪製的bitmaps.

       數據獲取採用的是環形Buffer這樣的數據結構(之前我的博客已經介紹過這個數據結構)。

 

基本的思路已經提供了,這個框架我在開發Android應用是屢試不爽了。但我要強調的是不是這個框架,而是這個框架中包含的計算,這裏面涉及到很多圖形圖像算法,數學算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章