SurfaceView的LockCanvas(Rect rect)的方法总结
来源:互联网 发布:mfp编程语言 编辑:程序博客网 时间:2024/06/05 13:22
搜到:
在刚开始学习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的操作。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
实际验证:
应该就是双缓冲机制,我遇到的canvasLock出现的问题:
进程中(){
Canvas canvas = surfaceholder_plusewave.lockCanvas(new Rect(oldX, 0, oldX + length, getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布
…………
surfaceholder_plusewave.unlockCanvasAndPost(canvas);
}
调试中出现的错误:
02-08 14:42:02.332: E/Surface(567): Surface::lock failed, already locked
02-08 14:42:02.347: E/SurfaceHolder(567): Exception locking surface
02-08 14:42:02.347: E/SurfaceHolder(567): java.lang.IllegalArgumentException
加上下面代码后,错误就没有了。
private int flag_lockcanvas=0;
进程中(){
Canvas canvas = surfaceholder_plusewave.lockCanvas(new Rect(oldX, 0, oldX + length, getWindowManager().getDefaultDisplay().getHeight()));// 关键:获取画布
…………
flag_lockcanvas++;
if (flag_lockcanvas >=3) {
surfaceholder_plusewave.unlockCanvasAndPost(canvas);
}
}
- 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的区别
- mysql --prompt一个很好用的命令
- 一个简单的java猜谜游戏
- javascript
- 学生宿舍管理系统
- 小数转化为分数
- SurfaceView的LockCanvas(Rect rect)的方法总结
- 如何添加一个Application Framework Service(二)(with native code)
- Ruby on Rails,在Controller中指定页面重定向
- 嵌入式linux环境搭建
- 用java代码创建隐藏文件
- Fedora 16下安装CouchDB 1.2.0
- script 写在body和head中的区别
- Android中设置分割线
- qsort和bsearch的使用