如何在Android中使用Surfaceview?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

創新互聯公司堅持網頁設計,我們不會倒閉、轉行,已經持續穩定運營十多年。專業網站建設公司技術,豐富的成功經驗和創作思維,提供一站式互聯網解決方案,攜手廣大客戶,共同發展進步。我們不僅會設計網站,更會營銷型網站建設。幫助中小型企業在“互聯網+"的時代里通過推廣營銷傳播路線轉型升級,累計幫助多家客戶實現網絡營銷化,與我們一起攜手共創未來!
一.surfaceview與view的區別
Android 提供了view進行視圖的繪制,可以滿足大部分的會圖需求,但在有些時候卻是心有余而力不足。我們知道,view通過刷新來繪制視圖。android系統通過vsync信號來進行屏幕的繪制。刷新的時間間隔為16毫秒。如果在16毫秒內完成了索要刷新的繪制操作,那么在視覺效果上就不會產生卡頓的感覺。如果邏輯操作過多,頻繁刷新就會造成界面的卡頓。
對于這一問題,Android提供了surfaceview來解決。它可以說是view的孿生兄弟,但他與view還是不同的,他與view的區別主要在一下幾點:
view 主要是用于主動更新的情況下,而surfaceview主要是用于被動更新的情況下,列如頻繁的刷新。
view主要是通過主線程對界面進行刷新,而surfaceview主要是通過子線程對view進行刷新。
view在繪制時沒有使用雙緩沖機制,而surfaceview的底層是使用了雙緩沖機制。
二.surfaceview的使用
surfaceview雖然使用比較復雜,但是他有一套使用的模板,這就使得他使用起來比較簡單了,通常情況下,我們將會使用如下的方法步驟來實現surfaceview的創建:
創建自定義的surfaceview,繼承自surfaceview 。并實現連個接口surfaceholder.Callback和Runnable接口。
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable
看如下方法,分別對應了surfaceview的創建改變和銷毀。
@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方法中不斷的繪制就可以實現view的及時刷新,當然我們也可以在run方法中sleep減少資源的消耗。這個值一般在50到100毫秒之間。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創新互聯行業資訊頻道,感謝您對創新互聯的支持。
網站欄目:如何在Android中使用Surfaceview
路徑分享:http://www.yijiale78.com/article6/gjhdog.html
成都網站建設公司_創新互聯,為您提供服務器托管、動態網站、響應式網站、全網營銷推廣、自適應網站、做網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯