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