您好,登錄后才能下訂單哦!
如何在Android中使用Surfaceview?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
一.surfaceview與view的區(qū)別
Android 提供了view進行視圖的繪制,可以滿足大部分的會圖需求,但在有些時候卻是心有余而力不足。我們知道,view通過刷新來繪制視圖。android系統(tǒng)通過vsync信號來進行屏幕的繪制。刷新的時間間隔為16毫秒。如果在16毫秒內(nèi)完成了索要刷新的繪制操作,那么在視覺效果上就不會產(chǎn)生卡頓的感覺。如果邏輯操作過多,頻繁刷新就會造成界面的卡頓。
對于這一問題,Android提供了surfaceview來解決。它可以說是view的孿生兄弟,但他與view還是不同的,他與view的區(qū)別主要在一下幾點:
view 主要是用于主動更新的情況下,而surfaceview主要是用于被動更新的情況下,列如頻繁的刷新。
view主要是通過主線程對界面進行刷新,而surfaceview主要是通過子線程對view進行刷新。
view在繪制時沒有使用雙緩沖機制,而surfaceview的底層是使用了雙緩沖機制。
二.surfaceview的使用
surfaceview雖然使用比較復雜,但是他有一套使用的模板,這就使得他使用起來比較簡單了,通常情況下,我們將會使用如下的方法步驟來實現(xiàn)surfaceview的創(chuàng)建:
創(chuàng)建自定義的surfaceview,繼承自surfaceview 。并實現(xiàn)連個接口surfaceholder.Callback和Runnable接口。
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable
看如下方法,分別對應了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的及時刷新,當然我們也可以在run方法中sleep減少資源的消耗。這個值一般在50到100毫秒之間。
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。