国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android Surfaceview的繪制與應用

2019-10-22 18:32:14
字體:
來源:轉載
供稿:網友

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的創建改變和銷毀。

@Overridepublic void surfaceCreated(SurfaceHolder holder) {}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic 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的繪制與應用的詳細介紹,關于Android View的重寫本站很多資料大家可以按需要查詢,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长治县| 滕州市| 瓮安县| 灌云县| 石台县| 丰城市| 广东省| 乐都县| 永昌县| 台前县| 元朗区| 和田县| 威远县| 蓝山县| 偃师市| 瑞安市| 满洲里市| 桓仁| 紫阳县| 台山市| 遵化市| 信丰县| 延安市| 茌平县| 商城县| 昌平区| 连平县| 钦州市| 合江县| 噶尔县| 乌兰察布市| 白河县| 南宁市| 五大连池市| 东方市| 兴安盟| 梅河口市| 崇州市| 肇州县| 登封市| 麻城市|