Android Surfaceview的繪制與應(yīng)用
Android Surfaceview的繪制與應(yīng)用
一.surfaceview與view的區(qū)別
Android 提供了view進(jìn)行視圖的繪制,可以滿足大部分的會圖需求,但在有些時候卻是心有余而力不足。我們知道,view通過刷新來繪制視圖。android系統(tǒng)通過vsync信號來進(jìn)行屏幕的繪制。刷新的時間間隔為16毫秒。如果在16毫秒內(nèi)完成了索要刷新的繪制操作,那么在視覺效果上就不會產(chǎn)生卡頓的感覺。如果邏輯操作過多,頻繁刷新就會造成界面的卡頓。
對于這一問題,Android提供了surfaceview來解決。它可以說是view的孿生兄弟,但他與view還是不同的,他與view的區(qū)別主要在一下幾點(diǎn):
view 主要是用于主動更新的情況下,而surfaceview主要是用于被動更新的情況下,列如頻繁的刷新。
view主要是通過主線程對界面進(jìn)行刷新,而surfaceview主要是通過子線程對view進(jìn)行刷新。
view在繪制時沒有使用雙緩沖機(jī)制,而surfaceview的底層是使用了雙緩沖機(jī)制。
二.surfaceview的使用
surfaceview雖然使用比較復(fù)雜,但是他有一套使用的模板,這就使得他使用起來比較簡單了,通常情況下,我們將會使用如下的方法步驟來實現(xiàn)surfaceview的創(chuàng)建:
創(chuàng)建自定義的surfaceview,繼承自surfaceview 。并實現(xiàn)連個接口surfaceholder.Callback和Runnable接口。
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable
看如下方法,分別對應(yīng)了surfaceview的創(chuàng)建改變和銷毀。
@Override public void surfaceCreated(SurfaceHolder holder) { } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { }
我們來看看他的模板:
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable { private SurfaceHolder mHolder; private Canvas mCanvs; private Boolean mIsDrawing; public MySurfaceView(Context context) { this(context, null); } public MySurfaceView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private void init() { mHolder = getHolder(); mHolder.addCallback(this); setFocusable(true); setFocusableInTouchMode(true); this.setKeepScreenOn(true); } @Override public void surfaceCreated(SurfaceHolder holder) { mIsDrawing = true; new Thread(this).start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { mIsDrawing = false; } @Override public void run() { while (mIsDrawing) { draw(); } } public void draw() { try { mCanvs = mHolder.lockCanvas(); } catch (Exception e) { } finally { mHolder.unlockCanvasAndPost(mCanvs); } } }
以上的模板基本滿足大部分surfaceview的繪圖需求,唯一要注意的是,要把
mHolder.unlockCanvasAndPost(mCanvs);
放到finally中以保證每次都能提交修改。
只要我們在run方法中不斷的繪制就可以實現(xiàn)view的及時刷新,當(dāng)然我們也可以在run方法中sleep減少資源的消耗。這個值一般在50到100毫秒之間。
以上就是Android Surfaceview的繪制與應(yīng)用的詳細(xì)介紹,關(guān)于Android View的重寫本站很多資料大家可以按需要查詢,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android AIDL實現(xiàn)兩個APP間的跨進(jìn)程通信實例
這篇文章主要為大家詳細(xì)介紹了Android AIDL實現(xiàn)兩個APP間的跨進(jìn)程通信實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04flutter實現(xiàn)頁面多個webview的方案詳解
這篇文章主要為大家詳細(xì)介紹了flutter如何實現(xiàn)頁面多個webview的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下2023-09-09Android 使用手機(jī)NFC的讀取NFC標(biāo)簽數(shù)據(jù)的方法
這篇文章主要介紹了Android 使用手機(jī)NFC的讀取NFC標(biāo)簽數(shù)據(jù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07Android MVVM架構(gòu)實現(xiàn)RecyclerView列表詳解流程
MVVM是Model-View-ViewModel的簡寫。它本質(zhì)上就是MVC 的改進(jìn)版。MVVM 就是將其中的View 的狀態(tài)和行為抽象化,讓我們將視圖 UI 和業(yè)務(wù)邏輯分開2021-10-10