SurfaceHolder的lockCanvas(Rect rect)问题

danielinbiti 2011-12-05 10:09:10
在使用的时候发现SurfaceHolder锁定的不是rect定义的大小,而是整个view的大小。rect的left,top,right,bottom也被改变。
看了一下以前的回复,说引用传递被改变,这个可以接受。但看以前的帖子,没有说明白为什么不lockCanvas自己定义的矩阵大小。或者说怎么能够获得自己定义的rect的canvas或者说在一定情况下这个方法存在一定的限制条件。
忘高手指点。
看书上还是网上的例子,似乎都是有效的。
...全文
509 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
danielinbiti 2012-03-04
  • 打赏
  • 举报
回复
补充一下这个问题的理解:
还是和surfaceview的双缓冲机制有关系,dirty区域根据front和back两个去计算,两个不一样的地方算dirty。
而且,推测刚初始化surfaceview后,front和back两个初始化不是一致的,所以在第一次和第二次的时候用rect锁定是无效的。
最好先post一下保持一致。

===============
这是最近一段时间学习后的解释,先补充上,对后来搜这问题的人能少走些弯路,少一些困惑。
danielinbiti 2011-12-14
  • 打赏
  • 举报
回复
暂时先用其他方式实现,等过段时间再细细测试一下lockcanvas
安卓机器人 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 danielinbiti 的回复:]

挂段时间看看,看是否和SDK之类的有关系。
国外论坛也有人提这问题,但也没看到解答。

写了个简单的例子,
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
Canvas canvas = holder.lockCanvas(null);//获取画布
Paint mPaint = new Paint();
mPaint.setColor(Colo……
[/Quote]
可以啊,你发我邮箱ncuboy_045wsq@sina.com
danielinbiti 2011-12-05
  • 打赏
  • 举报
回复
挂段时间看看,看是否和SDK之类的有关系。
国外论坛也有人提这问题,但也没看到解答。

写了个简单的例子,
if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
Canvas canvas = holder.lockCanvas(null);//获取画布
Paint mPaint = new Paint();
mPaint.setColor(Color.BLUE);
count = count + 10;
if(count>100){
count = 0;
}
canvas.drawRect(new RectF(40+count,60+count,80+count,80+count), mPaint);
holder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像
}
这样就能留下残影,但null换成rect,然后又悲剧了...清的干干静静。
不了解... ...哪能搞到lockCanvas的源码不?
安卓机器人 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 danielinbiti 的回复:]

这段话在别人答复中也看到过,但觉得太笼统了。
比如我定义一个0,0,100,100的surfaceview,
那我lockCanvas一个0,0,50,50 按理它应该只重画这个区域内的信息,但实际结果lockCanvas返回的区域是0,0,100,100的大小。

现在再找这个方法内部的实现逻辑。看看底层怎么写的。
[/Quote]
你可以试下canvas的clip方法,可以手动剪裁一个你要的区域,怎么样避免layer覆盖,你要花点心思
danielinbiti 2011-12-05
  • 打赏
  • 举报
回复
这段话在别人答复中也看到过,但觉得太笼统了。
比如我定义一个0,0,100,100的surfaceview,
那我lockCanvas一个0,0,50,50 按理它应该只重画这个区域内的信息,但实际结果lockCanvas返回的区域是0,0,100,100的大小。

现在再找这个方法内部的实现逻辑。看看底层怎么写的。
安卓机器人 2011-12-05
  • 打赏
  • 举报
回复
lockCanvas(Rect dirty)按照官方的解释是:Just like lockCanvas() but allows to specify a dirty rectangle.
我们可以指定自己的脏区域,置于为什么你会错觉的认为是整个View,唯一可能的解释是你每次传递的dirty都是整个区域的rect,下面解释下为什么:
holder.lockCanvas(Rect dirty);

调用这个函数之后,dirty会被更改,改掉后的值,是真正的dirty区域 (因为多个layer覆盖的问题,你的dirty不见得就是系统要的dirty)
上面的关键是多个layer覆盖,比如你第一次dirty是整个View,以后你再怎么调用lockCanvas()dirty都会是整个
View,这个集合论中的或集

80,361

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧