SurfaceView的LockCanvas(Rect rect)的方法总结
来源:互联网 发布:kingroot咋网络连不上 编辑:程序博客网 时间:2024/06/05 17:11
在刚开始学习SurfaceView的时候,关注它的原因其中一个也是因为能够按区域刷新,不用像View一样整个屏幕全部重画。但当时在测试后的时候发现了问题。发现LockCanvas(Rect rect)无效。但多点击几次后,发现又是有用的。
最初查源码,找资料,也可能跟刚开始学,没有实际的去应用,理解的不深。最近自己再开发另一个小游戏时候,选择了使用SurfaceView,再使用一段时间,在找另一个问题的解决方法时,无意中把看到的资料贯穿起来,发现能够很好的解释这个问题。
一、首先SurfaceView是双缓冲机制,有front和back,这两个交替显示,没post一次交替一次。
二、dirty区域是根据front和back来进行计算的。
三、程序没有填充的都算dirty区域
有了这几个前提后,自己的问题发现就解决了。首先自己第一、二次点击时,LockCanvas(Rect rect)无效,是因为back没有进行过程序填充,所以和front计算后,dirty是整个屏幕,而不是自己定义的rect大小。等交替完成一次后,front和back的背景就一致了,差别就在于自己定义的rect大小。
所以,要想使用dirty区域,可以在程序启动后,直接清两次屏,post后,然后再进行SurfaceView的操作。
不用画布,直接在窗口上进行绘图叫做无缓冲绘图。用了一个画布,将所有内容都先画到画布上,在整体绘制到窗口上,就该叫做单缓冲绘图,那个画布就是一个缓冲区。用了两个画布,一个进行临时的绘图,一个进行最终的绘图,这样就叫做双缓冲绘图。
surfaceView自身实现了双缓冲,而View没有。其实view你也可以自己实现,但是实现的结构不如surfaceView好。
surfaceView通过 surfaceHolder.lockCanvas 锁定画布,实现下一张图片的绘制,再通过另外的线程刷新界面,绘制图片。
view则是直接在ondraw里绘制图片,刷新界面。其实view也可以实现双缓冲机制,你可以在另个出ondraw的方法中绘制下一张bitmap(参见:http://blog.csdn.net/liubingzhao/article/details/5563113),也可以另开一个线程,处理除了绘制图片以外的操作(参见:http://topic.csdn.net/u/20110901/23/e283f805-20dc-40c3-8381-403dd1ca69b0.html),就实现了view的双缓冲。
为什么动态绘图surfaceView要比View好?
因为View是在UI主线程中进行绘制的,绘制时会阻塞主线程,如果ontouch事件又处理的比较多的话会导致界面卡。而surfaceView是另开了一个线程绘制的,再加上双缓冲机制,所以要高效。不会卡。其实现在一般实现view的时候一般都会在其他出先生成bitmap在给ondraw去画,所以双缓冲的作用不是那么明显了(个人认为)。
- SurfaceView的LockCanvas(Rect rect)的方法总结
- SurfaceView的LockCanvas(Rect rect)的方法总结
- SurfaceView的LockCanvas(Rect rect)的方法总结
- android drawable-(hdpi,mdpi,ldpi)的区别和关于surfaceholder.lockCanvas(rect)方法的疑问
- android drawable-(hdpi,mdpi,ldpi)的区别和关于surfaceholder.lockCanvas(rect)方法的疑问
- Android RectF转换为Rect的方法
- android源码中常用的Rect方法
- 防止图像Rect区域越界的方法
- Rect的合并 TCANVAS
- RECT的简明解释
- android Rect的使用
- android Rect的使用
- MFC Rect 的详解
- android Rect的使用
- android Rect的使用
- rect
- Rect
- Rect和RectF的区别
- Mac OS 配置Maven
- A+B Problem III
- java 设计模式集锦
- java 反射
- 003_013 Python 将数decimal用于货币处理
- SurfaceView的LockCanvas(Rect rect)的方法总结
- 关于JAVA do--while的简单示例说明记录
- 性能计数器注册表配置单元一致性
- Ubuntu环境变量的设置
- --3.3 SQL数据查询
- DBUtil
- 自定义控件 C# 无边框按钮,获得焦点时也没有框
- 我的【数据可视化】——d3.js(1)
- Readonly和Disabled的区别