Android系统提供了View进行绘图处理,View可以满足大部分的绘图需求,但是在某些时候,却也是心有力而力不足,我们知道View通过刷新来进行重绘图,Android系统通过发出VSYNC信号来进行屏幕的重绘,刷新的时间为16ms,如果子啊16ms内view完成了你所要执行的所有操作,那么用户在视觉上就不会产生卡顿的感觉,而如果执行的操作逻辑过多,特别是需要频繁刷新的街面上,例如游戏界面,那么就会不断的阻塞主线程,从而导致画面卡顿。很多时候会在Log中看到“skipped xxx frames!The application may be doing too much”这句警告。

为了避免这一问题的产生,Android提供了SurfaceView组件来解决这一个问题,SurfaceView可以说是View的孪生兄弟,但是还是与View有所不同。主要在以下的几点:

1.View主要适用于主动更新的情况,而SurfaceView主要适用于被动更新,例如频繁的刷新。

2.View在主线程中队画面进行刷新,而SurfaceView通常会通过一个子线程来进行页面的刷新。

3.View在绘图时没有双缓冲机制,而SurfaceView在底层实现机制上已经实现了双缓冲机制。

总之,如果要是自定义view需要尽心频繁的刷新,或者是刷新数据处理量比较大的,那么就要考虑使用SurfaceView来替代View.