SurfaceView是View的继承结构中一个比较特殊的子类,它的作用是提供一个第二线程来完成图形的绘制。因此应用程序不需要等待View的图形绘制,第二线程会异步完成图形的绘制。
SurfaceView实现的步骤:
- 继续SurfaceView并实现SurfaceHolder.Callback接口,该接口提供了SurfaceView创建、属性发生变化、销毁的时间点,那么你可以在适当的时间点完成具体的工作。
- 在SurfaceView初始化的时候调用SurfaceView.getHolder()方法获取一个SurfaceHolder,SurfaceHolder用于管理SurfaceView的工作过程。为了让SurfaceHolder起作用,必须为SurfaceHolder添加回调方法(即第一步实现的SurfaceHolder.Callback):
- 在SurfaceView内创建第二线程的内部类(暂命名为SecondThread),它的主要任务是完成Canvas的图形绘制。为了能让SecondThread获得Canvas实例,必须给SecondThread传递在步骤二中获得的SurfaceHolder。现在就可以通过SurfaceHolder.lockCanvas()方法得到Canvas实例,并在Canvas上绘制图形。当图形绘制完成后,必须马上调用SurfaceHolder.unlockCanvasAndPost()为Canvas解锁,使其他线程可以使用该画布。
有几个注意点:
- 每一次通过SurfaceHolder获取的Canvas都会保持上一次绘制的状态。如果需要重新绘制图形,可以通过调用Canvas.drawColor()或Canvas.drawBitmap()来擦除上次遗留的图形。
- 并不一定只用第二线程来绘制图形,也可以开启第三,第四个线程来绘制图形。
- 注意线程安全。
- 不需要像View一样,调用invalidate()方法来指示图形的刷新。
SurfaceView的一个范例:
Notice:例子中,没一次按下方向键都得把所有坐标重新绘制一遍。如果只是绘制最后一次没绘制的点时,不知道为什么会变成虚线,有待解决。
分享到:
相关推荐
Android的SurfaceView实现图片缩放、滑动,网上资源不多,目前还有些问题,仅供参考。
Android SurfaceView 实现实时显示摄像头视频,详见博客:https://blog.csdn.net/qq_30297763/article/details/90241102
Android SurfaceView实现动画效果
Android SurfaceView实现加载GIF动画
基于android的SurfaceView实现人物动画的一个简单示例程序。
这是一个android SurfaceView双缓冲Demo,希望对大家理解android SurfaceView双缓冲有所帮助。
android学习 SurfaceView实现人物动画,代码通过测试并且附有APK编译文件,可直接在手机上运行
Android开发中,如何实现SurfaceView添加组件view不被组件覆盖。
android surfaceview自定义拍照 绘制头像轮廓 注明:是借用网上的demo基础上进行修改的
android摄像头预览界面呈现自定义的矩形框,只拍摄(矩形框)特定区域的图片,然后根据图片解析条码。
Android圆形相机预览窗口,圆形SurfaceView
Android SurfaceView 实现实时显示摄像头视频,详见博客:https://blog.csdn.net/qq_30297763/article/details/90241102
Android SurfaceView+MediaRecorder实现的录音波浪图
android surfaceView实现的触屏产生烟花程序
Android SurfaceView实现画心,详细及效果见:http://blog.csdn.net/bigboysunshine/article/details/53898806
实现编程中surfaceview的基本用法的实例
Android surfaceview实现幸运大抽奖
Android开发摄像头SurfaceView预览 背景画图(矩形和圆形) 实现(双surfaceview,顶层画矩形框,底层预览视频); UI:三个按钮 预览 摄像 图片保存,预览界面 可以显示(矩形和圆形等图画)
安卓Android源码——安卓Android使用SurfaceView实现墨迹天气的风车效果.zip
android camera mirror 前置后置相机视频预览时左右镜像,实现镜子效果 基于以下网址实现的android studio项目源代码包,可以直接打开使用 https://blog.csdn.net/mbrose/article/details/80167781 代码做了一...