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接口。
publicclassMySurfaceViewextendsSurfaceViewimplements SurfaceHolder.Callback,Runnable
看如下方法,分别对应了surfaceview的创建改变和销毁。
@Override publicvoidsurfaceCreated(SurfaceHolderholder){ } @Override publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){ } @Override publicvoidsurfaceDestroyed(SurfaceHolderholder){ }
我们来看看他的模板:
publicclassMySurfaceViewextendsSurfaceViewimplementsSurfaceHolder.Callback,Runnable{ privateSurfaceHoldermHolder; privateCanvasmCanvs; privateBooleanmIsDrawing; publicMySurfaceView(Contextcontext){ this(context,null); } publicMySurfaceView(Contextcontext,AttributeSetattrs){ this(context,attrs,0); } publicMySurfaceView(Contextcontext,AttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); } privatevoidinit(){ mHolder=getHolder(); mHolder.addCallback(this); setFocusable(true); setFocusableInTouchMode(true); this.setKeepScreenOn(true); } @Override publicvoidsurfaceCreated(SurfaceHolderholder){ mIsDrawing=true; newThread(this).start(); } @Override publicvoidsurfaceChanged(SurfaceHolderholder,intformat,intwidth,intheight){ } @Override publicvoidsurfaceDestroyed(SurfaceHolderholder){ mIsDrawing=false; } @Override publicvoidrun(){ while(mIsDrawing){ draw(); } } publicvoiddraw(){ try{ mCanvs=mHolder.lockCanvas(); }catch(Exceptione){ }finally{ mHolder.unlockCanvasAndPost(mCanvs); } } }
以上的模板基本满足大部分surfaceview的绘图需求,唯一要注意的是,要把
mHolder.unlockCanvasAndPost(mCanvs);
放到finally中以保证每次都能提交修改。
只要我们在run方法中不断的绘制就可以实现view的及时刷新,当然我们也可以在run方法中sleep减少资源的消耗。这个值一般在50到100毫秒之间。
以上就是Android Surfaceview的绘制与应用的详细介绍,关于AndroidView的重写本站很多资料大家可以按需要查询,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!