当前位置: 移动技术网 > IT编程>移动开发>Android > Android Surfaceview的绘制与应用

Android Surfaceview的绘制与应用

2019年07月24日  | 移动技术网IT编程  | 我要评论

河南南阳陈光杰被查,憨人有憨福 女尊,0258是哪里的区号

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的重写本站很多资料大家可以按需要查询,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网