android surfaceview画图,Android Surfaceview的绘制与应用_Android_脚本之家

本文深入探讨了Android SurfaceView的绘制原理及其与View的区别。SurfaceView适用于频繁刷新的场景,通过子线程进行绘制,采用双缓冲机制避免界面卡顿。文章介绍了SurfaceView的使用模板,包括创建、改变和销毁回调,以及如何实现连续刷新和资源管理。了解这些,能更好地利用SurfaceView提升Android应用的性能。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值