在使用的时候发现SurfaceHolder锁定的不是rect定义的大小,而是整个view的大小。rect的left,top,right,bottom也被改变。
看了一下以前的回复,说引用传递被改变,这个可以接受。但看以前的帖子,没有说明白为什么不lockCanvas自己定义的矩阵大小。或者说怎么能够获得自己定义的rect的canvas或者说在一定情况下这个方法存在一定的限制条件。
忘高手指点。
看书上还是网上的例子,似乎都是有效的。
看了一下以前的回复,说引用传递被改变,这个可以接受。但看以前的帖子,没有说明白为什么不lockCanvas自己定义的矩阵大小。或者说怎么能够获得自己定义的rect的canvas或者说在一定情况下这个方法存在一定的限制条件。
忘高手指点。
看书上还是网上的例子,似乎都是有效的。
解决方案 »
- 第一天学习Android 怎么见不了工程?
- android如何中断service中的crash? 不是高手不懂??
- Activity传值问题,新手求教
- 智能指针RefBase、LightRefBase的incStrong、decStrong是不是线程不安全的?
- 今天心情不错,大家节后快乐
- windows的压力感应API
- 发送POST请求,被拒绝?
- 怎么讲图片资源的drawable类里面的静态常量读到数组里面去
- android怎么解决android-support-v4.jar冲突
- 如何使用返回键移除通过WindowManager添加的View?
- 做一个应用要支持所有网络,请教高手了!
- 急!!!模拟器没有信号。在线等回答!谢谢好心人
我们可以指定自己的脏区域,置于为什么你会错觉的认为是整个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一下保持一致。===============
这是最近一段时间学习后的解释,先补充上,对后来搜这问题的人能少走些弯路,少一些困惑。