欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android  Surfaceview的繪制與應(yīng)用

 更新時(shí)間:2017年07月14日 11:22:25   作者:hubertlou  
這篇文章主要介紹了Android Surfaceview的繪制與應(yīng)用的相關(guān)資料,需要的朋友可以參考下

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)文章

最新評(píng)論