Android  Surfaceview的绘制与应用

 更新时间:2017年07月14日 11:22:25   作者:hubertlou  
这篇文章主要介绍了Android Surfaceview的绘制与应用的相关资料,需要的朋友可以参考下

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的绘制与应用的详细介绍,关于Android View的重写本站很多资料大家可以按需要查询,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Android光线传感器使用方法详解

    Android光线传感器使用方法详解

    这篇文章主要为大家详细介绍了Android光线传感器的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Android手机信号强度检测详细介绍

    Android手机信号强度检测详细介绍

    这篇文章主要介绍了Android手机信号强度检测的相关资料,android定义了2种信号单位:dBm和asu。具体两种的关系本文给大家介绍非常详细,需要的朋友可以参考下
    2016-11-11
  • 详解Android 多级联动控件实现思路讨论

    详解Android 多级联动控件实现思路讨论

    这篇文章主要介绍了详解Android 多级联动控件实现思路讨论,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Android实现从本地图库/相机拍照后裁剪图片并设置头像

    Android实现从本地图库/相机拍照后裁剪图片并设置头像

    玩qq或者是微信的盆友都知道,这些聊天工具里都要设置头像,一般情况下大家的解决办法是从本地图库选择图片或是从相机拍照,然后根据自己的喜爱截取图片,接下来通过本文给大家介绍Android实现从本地图库/相机拍照后裁剪图片并设置头像,需要的朋友参考下
    2016-02-02
  • Android 8.0 慢充和快充提示语的实现原理

    Android 8.0 慢充和快充提示语的实现原理

    这篇文章主要介绍了Android 8.0 慢充和快充提示语的实现原理,感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-05-05
  • Android手机使用Fiddler方法介绍

    Android手机使用Fiddler方法介绍

    这篇文章主要为大家详细介绍了Android手机使用Fiddler方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Java语言读取配置文件config.properties的方法讲解

    Java语言读取配置文件config.properties的方法讲解

    今天小编就为大家分享一篇关于Java语言读取配置文件config.properties的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Android webView字体突然变小的原因及解决

    Android webView字体突然变小的原因及解决

    这篇文章主要介绍了Android webView字体突然变小的原因及解决,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-03-03
  • android实现倒计时动态圈

    android实现倒计时动态圈

    这篇文章主要为大家详细介绍了android实现倒计时动态圈,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • Android Mms之:对话与联系人关联的总结详解

    Android Mms之:对话与联系人关联的总结详解

    本篇文章是对Android中对话与联系人的关联进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论