溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Android中使用Surfaceview

發(fā)布時間:2021-03-10 16:24:30 來源:億速云 閱讀:175 作者:Leah 欄目:移動開發(fā)

如何在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è)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI