在使用的时候发现SurfaceHolder锁定的不是rect定义的大小,而是整个view的大小。rect的left,top,right,bottom也被改变。
看了一下以前的回复,说引用传递被改变,这个可以接受。但看以前的帖子,没有说明白为什么不lockCanvas自己定义的矩阵大小。或者说怎么能够获得自己定义的rect的canvas或者说在一定情况下这个方法存在一定的限制条件。
忘高手指点。
看书上还是网上的例子,似乎都是有效的。
看了一下以前的回复,说引用传递被改变,这个可以接受。但看以前的帖子,没有说明白为什么不lockCanvas自己定义的矩阵大小。或者说怎么能够获得自己定义的rect的canvas或者说在一定情况下这个方法存在一定的限制条件。
忘高手指点。
看书上还是网上的例子,似乎都是有效的。
解决方案 »
- 为什么我重新安装了个eclipse不能下载adt?
- 怎么得到listview长按事件中按的是哪个条目?用这个方法不行啊
- SlidingDrawer怎么让content里的内容不拉时就显示一部分出来
- gallery.setAdapter中为什么老是说ImageAdapter是不可识别的类型
- Android 开发做游戏和做软件哪个更好?
- 朋友求个安卓app,询问下报价
- android中如何使自己的APP出现在被选择分享的列表里?
- activity的切换动画里,进入的activity动画怎么不覆盖掉退出的activity动画
- 强行删了一个项目之后就GG了,,求救
- Android studio 使用git版本控制,怎么使用账号和密码不使用ssh免密登录?
- 做一个应用要支持所有网络,请教高手了!
- 急!!!模拟器没有信号。在线等回答!谢谢好心人
我们可以指定自己的脏区域,置于为什么你会错觉的认为是整个View,唯一可能的解释是你每次传递的dirty都是整个区域的rect,下面解释下为什么:
holder.lockCanvas(Rect dirty);调用这个函数之后,dirty会被更改,改掉后的值,是真正的dirty区域 (因为多个layer覆盖的问题,你的dirty不见得就是系统要的dirty)
上面的关键是多个layer覆盖,比如你第一次dirty是整个View,以后你再怎么调用lockCanvas()dirty都会是整个
View,这个集合论中的或集
比如我定义一个0,0,100,100的surfaceview,
那我lockCanvas一个0,0,50,50 按理它应该只重画这个区域内的信息,但实际结果lockCanvas返回的区域是0,0,100,100的大小。现在再找这个方法内部的实现逻辑。看看底层怎么写的。
国外论坛也有人提这问题,但也没看到解答。写了个简单的例子,
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的源码不?
还是和surfaceview的双缓冲机制有关系,dirty区域根据front和back两个去计算,两个不一样的地方算dirty。
而且,推测刚初始化surfaceview后,front和back两个初始化不是一致的,所以在第一次和第二次的时候用rect锁定是无效的。
最好先post一下保持一致。===============
这是最近一段时间学习后的解释,先补充上,对后来搜这问题的人能少走些弯路,少一些困惑。