SurfaceView
1、SurfaceView的基本介绍
SurfaceView 是继承自View的,属于View的一个小小的分枝。
- View 通过onDraw()方法里面的Canvas对象去绘制自己到屏幕上面。
- SurfaceView 并不需要实现OnDraw()方法。那么我们的Surface是如何绘制自身的呢!其实View是在UI线程当中绘制自己,而SurfaceView是在子线程当中绘制自身。就是因为在子线程当中绘制自己所以不管绘制是多么的缓慢,还是绘制方法多么频繁的调用,其都不会阻塞UI线程。所以像播放视频时候使用的View,还是游戏所使用的View都是SurfaceView,而不是View。
SurfaceView是在子线程当中进行绘制,那么它是如何获取到Canvas的,如何进行绘制的?
答:在SurfaceView当中存在一个Surface,而在Surface当中持有Canvas,但是我们拿不到Surface,系统为之暴露了一个SurfaceHolder(Surface的持有者),那么我们可以通过SurfaceView获取SurfaceHolder,然后通过SurfaceHolder获取Canvas。
1
2SurfaceHolder holder = new SurfaceView().getHolder();
Canvas canvas = holder.getCanvas();SurfaceView的绘制时机是什么时候,我们知道View的绘制时机是在onDraw()方法里面,但是SurfaceView的绘制时机在什么时候。==
答:之前说过的SurfaceHolder不仅仅能获取Canvas对象,其实SurfaceHolder还管理者SurfaceView的生命周期。同时生命周期如下所示:
- SurfaceCreated():创建相应的子线程,然后在子线程的run()方法当中开启对SurfaceView的绘制
- SurfaceChanged():相当与对SurfaceView的进行监听。
- SurfaceDestorye():关闭我们子线程,以及对一些资源的回收。
2、SurfaceView的基本写法
常见的SurfaceView的写法,这里是模版代码
1 |
|