AndroidSurfaceview的绘制与应用

概述Android Surfaceview的绘制与应用一.surfaceview与view的区别Android提供了view进行视图的绘制,可以满足大部分的会图需求,但在有些时候却是心有余而力不足。我们知道,view通过刷新来绘制视图。android系统

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,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 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 Surfaceview的绘制与应用全部内容,希望文章能够帮你解决Android Surfaceview的绘制与应用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1145614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存