Android Surfaceview的繪制與應(yīng)用
Android Surfaceview的繪制與應(yīng)用
一.surfaceview與view的區(qū)別
Android 提供了view進(jìn)行視圖的繪制,可以滿足大部分的會(huì)圖需求,但在有些時(shí)候卻是心有余而力不足。我們知道,view通過(guò)刷新來(lái)繪制視圖。android系統(tǒng)通過(guò)vsync信號(hào)來(lái)進(jìn)行屏幕的繪制。刷新的時(shí)間間隔為16毫秒。如果在16毫秒內(nèi)完成了索要刷新的繪制操作,那么在視覺(jué)效果上就不會(huì)產(chǎn)生卡頓的感覺(jué)。如果邏輯操作過(guò)多,頻繁刷新就會(huì)造成界面的卡頓。
對(duì)于這一問(wèn)題,Android提供了surfaceview來(lái)解決。它可以說(shuō)是view的孿生兄弟,但他與view還是不同的,他與view的區(qū)別主要在一下幾點(diǎn):
view 主要是用于主動(dòng)更新的情況下,而surfaceview主要是用于被動(dòng)更新的情況下,列如頻繁的刷新。
view主要是通過(guò)主線程對(duì)界面進(jìn)行刷新,而surfaceview主要是通過(guò)子線程對(duì)view進(jìn)行刷新。
view在繪制時(shí)沒(méi)有使用雙緩沖機(jī)制,而surfaceview的底層是使用了雙緩沖機(jī)制。
二.surfaceview的使用
surfaceview雖然使用比較復(fù)雜,但是他有一套使用的模板,這就使得他使用起來(lái)比較簡(jiǎn)單了,通常情況下,我們將會(huì)使用如下的方法步驟來(lái)實(shí)現(xiàn)surfaceview的創(chuàng)建:
創(chuàng)建自定義的surfaceview,繼承自surfaceview 。并實(shí)現(xiàn)連個(gè)接口surfaceholder.Callback和Runnable接口。
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable
看如下方法,分別對(duì)應(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) { }
我們來(lái)看看他的模板:
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中以保證每次都能提交修改。
只要我們?cè)趓un方法中不斷的繪制就可以實(shí)現(xiàn)view的及時(shí)刷新,當(dāng)然我們也可以在run方法中sleep減少資源的消耗。這個(gè)值一般在50到100毫秒之間。
以上就是Android Surfaceview的繪制與應(yīng)用的詳細(xì)介紹,關(guān)于Android View的重寫(xiě)本站很多資料大家可以按需要查詢,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android自定義gridView仿頭條頻道拖動(dòng)管理功能
這篇文章主要介紹了Android自定義gridView仿頭條頻道拖動(dòng)管理功能,本文通過(guò)實(shí)例代碼效果圖展示給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Android反編譯看看手Q口令紅包的實(shí)現(xiàn)原理
這篇文章主要介紹了Android反編譯看看手Q口令紅包的實(shí)現(xiàn)原理,需要的朋友可以參考下2016-02-02Android AIDL實(shí)現(xiàn)兩個(gè)APP間的跨進(jìn)程通信實(shí)例
這篇文章主要為大家詳細(xì)介紹了Android AIDL實(shí)現(xiàn)兩個(gè)APP間的跨進(jìn)程通信實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04flutter實(shí)現(xiàn)頁(yè)面多個(gè)webview的方案詳解
這篇文章主要為大家詳細(xì)介紹了flutter如何實(shí)現(xiàn)頁(yè)面多個(gè)webview的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下2023-09-09Android 使用手機(jī)NFC的讀取NFC標(biāo)簽數(shù)據(jù)的方法
這篇文章主要介紹了Android 使用手機(jī)NFC的讀取NFC標(biāo)簽數(shù)據(jù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Android?手寫(xiě)熱修復(fù)dex實(shí)例詳解
這篇文章主要為大家介紹了Android?手寫(xiě)熱修復(fù)dex實(shí)現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Android MVVM架構(gòu)實(shí)現(xiàn)RecyclerView列表詳解流程
MVVM是Model-View-ViewModel的簡(jiǎn)寫(xiě)。它本質(zhì)上就是MVC 的改進(jìn)版。MVVM 就是將其中的View 的狀態(tài)和行為抽象化,讓我們將視圖 UI 和業(yè)務(wù)邏輯分開(kāi)2021-10-10