在使用的时候发现SurfaceHolder锁定的不是rect定义的大小,而是整个view的大小。rect的left,top,right,bottom也被改变。
看了一下以前的回复,说引用传递被改变,这个可以接受。但看以前的帖子,没有说明白为什么不lockCanvas自己定义的矩阵大小。或者说怎么能够获得自己定义的rect的canvas或者说在一定情况下这个方法存在一定的限制条件。
忘高手指点。
看书上还是网上的例子,似乎都是有效的。

解决方案 »

  1.   

    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,这个集合论中的或集
      

  2.   

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

  3.   

    你可以试下canvas的clip方法,可以手动剪裁一个你要的区域,怎么样避免layer覆盖,你要花点心思
      

  4.   

    挂段时间看看,看是否和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的源码不?
      

  5.   

    可以啊,你发我邮箱[email protected]
      

  6.   

    暂时先用其他方式实现,等过段时间再细细测试一下lockcanvas
      

  7.   

    补充一下这个问题的理解:
    还是和surfaceview的双缓冲机制有关系,dirty区域根据front和back两个去计算,两个不一样的地方算dirty。
    而且,推测刚初始化surfaceview后,front和back两个初始化不是一致的,所以在第一次和第二次的时候用rect锁定是无效的。
    最好先post一下保持一致。===============
    这是最近一段时间学习后的解释,先补充上,对后来搜这问题的人能少走些弯路,少一些困惑。