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

首頁 > 系統 > Android > 正文

Android Surfaceview的繪制與應用

2019-12-12 02:28:15
字體:
來源:轉載
供稿:網友

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的重寫本站很多資料大家可以按需要查詢,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 连云港市| 永年县| 乳源| 库车县| 米林县| 丹凤县| 句容市| 遵义市| 调兵山市| 乐平市| 巴青县| 新和县| 德安县| 闽侯县| 寿宁县| 和田市| 南木林县| 临澧县| 鄱阳县| 荆门市| 安福县| 武乡县| 凌云县| 望都县| 峨边| 卢龙县| 克东县| 大悟县| 电白县| 建宁县| 新乡市| 湛江市| 石渠县| 定结县| 呈贡县| 屏山县| 弋阳县| 澄江县| 东乡| 五河县| 黄平县|