4

当我在视图中调用 invalidate(rect) 时,我希望它清除画布上的“rect”区域,并执行 onDraw 中指定的操作。问题是,它忽略了给定的“rect”边界,并使整个视图无效。

我做了一个小测试程序来显示我的问题。启动应用程序时,将绘制第一条线。当用户触摸屏幕时,将绘制第二条线(并在该区域上调用 invalidate(rect))。第 1 行故意不重绘。问题是第 1 行消失了,屏幕上只显示第 2 行。

代码:

    public class TestInval extends View
    {

        ...    

        @Override
        protected void onDraw(Canvas canvas)
        {
            super.onDraw(canvas);

            Log.d(TAG, "onDraw bounds: " + canvas.getClipBounds()); //Logs: Rect(0, 0 - 720, 1134)

            if (drawOtherLine)
                canvas.drawLine(50, 50, 100, 100, defaultPaint);
            else
                canvas.drawLine(0, 0, 50, 50, defaultPaint);
        }
   
        ..
        public boolean onTouch(View view, MotionEvent motionEvent)
        {
            if (motionEvent.getAction() == MotionEvent.ACTION_UP)
            {
                drawOtherLine = true;

                Rect invalidateRect = new Rect(50, 50, 100, 100);

                invalidate(invalidateRect);
            }

            return true;
        }
        

        @Override
        public void invalidate(Rect dirty)
        {
            Log.d(TAG, "invalidate: " + dirty); //Logs: Rect(50, 50 - 100, 100)
            super.invalidate(dirty);
        } 

预期的 实际的

更新:

我的设备,运行 4.1.2 的三星 Galaxy S3 没有植根,似乎是问题所在。在 android 模拟器上运行相同的测试应用程序会给出预期的剪辑范围。仍然不确定为什么我的设备会出现这种情况。

4

0 回答 0