赞
踩
Android已经提供了View绘图处理,View可以满足大部分的绘图场景,View通过刷新来重回视图,android系统通过发出VSYNC信号进行视图的重 绘,刷新间隔为16ms,超过16ms,我们可能就会感到卡顿了。对于逻辑太多,操作复杂的场景,频繁的刷新界面,就会阻塞主线程,也会导致界面卡顿。
很多时候,我们在自定义View的Log日志看到这样的警告
Skipped 47 frames! The application may be doing too much work on it`s main thread.
这些告警就是因为在绘制过程中,处理逻辑太多造成的。 为了避免这些问题的产生,Android系统提供了SurfaceView,SurfaceView是VIew的孪生兄弟,但它与View还是有所不同的。
SurfaceView与View的区别View适用于主动更新的情况,而SurfaceView主要用于被动更新,比如:频繁的刷新.
View在主线程里面进行刷新,而SurfaceView主要通过一个子线程来进行页面的刷新
View在绘图时没有使用双缓冲机制,而SurfaceView在底层实现机制中已经实现了双缓冲机制 总结起来就是,如果自定义View需要频繁刷新,或者刷新时数据处理大,那就可以考虑使用SurfaceView来取代View。
SurfaceView的使用SurfaceView的使用,要比View复杂,但是它也有一套模板来使用,大部分都可以嵌套这个模板进行使用。
创建SurfaceView 创建自定义的SurfaceView继承SurfaceView,并实现两个接口,SurfaceHolder.Callback、Runnable
public class TempleSurfaceView extends SurfaceView implements SurfaceHolder.Callback,Runnable{}
实现SurfaceHolder.Callback接口,需要实现下面的方法:
- //创建
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
-
- }
- //改变
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
-
- }
- //销毁
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
-
- }
实现Runnable接口,需要实现下面的方法:
- @Override
- public void run() {
- //子线程
- }
- // SurfaceHolder
- private SurfaceHolder mHolder;
- // 用于绘图的Canvas
- private Canvas mCanvas;
- // 子线程标志位
- private boolean mIsDrawing;
主要是初始化SurfaceHolder对象,并注册SurfaceHolder 的回调方法。
- mHolder = getHolder();
- mHolder.addCallback(this);
另外两个,Canvas和标志位。Canvas与View的onDraw()方法的Canvas一样,用来进行绘图,标志位是用来控制线程的,SurfaceView是新起子线程来绘制的,而这个标志位就是控制子线程的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。