Android 开发view、surfaceview、GLsurfaceview的区别及基于surfaceview的示波器开发
Android画布(View SurfaceView GLsurfaceView)
View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢。
SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。
GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图;是SurfaceView的子类,openGL专用。
SurfaceView和View的区别为:View的绘图必须在当前UI线程中进行,也就是部分程序需要更新View组件时总要采用新的线程去更新SurfaceView的绘制;但SurfaceView就不会存在这个问题,因为SurfaceView的绘图是由SurfaceHolder来完成的。
对于View组件来说,如果程序需要花费较长的时间来更新绘画,那么主UI线程将会被阻塞,无法响应用户的任何动作;而SurfaceHolder则会启用新的线程去更新SurfaceView的绘制,因此不会阻塞主UI线程。
一般来说,如果Android程序或游戏界面的动画元素较多,而且很多动画元素的移动都需要通过定时器来控制,就可以考虑SurfaceView,而不是View。
所以基于以上,根据不同的时间需求,一般分成两类。
1.被动更新画面的,用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate()。这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。
2.主动更新,比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。
一般2D游戏开发使用SurfaceView足够,因为它也是google专们扩展用于2D游戏开发的画布使用普通的游戏画布(Android中2D专用游戏画布)中进行绘制图片,然后在GLSurfaceView(Android中3D游戏专用画布)中渲染图片的对比中发现GLSurfaceView的效率高于SurfaceView的30倍;GLSurfaceView的效率主要是因为机器硬件的GPU加速,现在flash技术也有了GPU加速技术;
基于SurfaceView开发的示波器
程序代码如下:
1、绘制示波器背景颜色及坐标轴
private void drawBack(SurfaceHolder holder)
{
Canvas canvas = holder.lockCanvas();
// 绘制白色背景
canvas.drawColor(Color.WHITE);
paint.setColor(Color.BLACK);
// 绘制坐标轴
canvas.drawLine(X_OFFSET, centerY,
screenWidth, centerY, paint);
canvas.drawLine(X_OFFSET, 40f, X_OFFSET