当我在视图中调用 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 模拟器上运行相同的测试应用程序会给出预期的剪辑范围。仍然不确定为什么我的设备会出现这种情况。