Clear/Reset 整个 ImageView canvas

Clear/Reset entire ImageView canvas

我有一个带有 2 个 imageView 的简单布局:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <ImageView
        android:id="@+id/takenPicture"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
     />

     <com.example.dochjavatestimplementation.pkgActivity.ExtendedImageView
        android:id="@+id/takenPicture2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
      />
    
</RelativeLayout>

第一个ImageView显示位图,第二个ImageView(1)是自定义的ImageViewExtendedImageView)(2)绘制一个canvas得到显示在普通 ImageView 之上。 这看起来像这样: displayimageviews

我想要的是在我的 onDraw 方法中绘制矩形之后,我想再次清除矩形(现在只是为了测试目的)。这是我的代码的样子:

@Override
protected void onDraw(Canvas canvas) {

    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setStrokeWidth(3);
    canvas.drawRect(new Rect(212,0,-720,600),paint);
    
    //clear the rect/contents of canvas again
    //try 1
    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.MULTIPLY);
    canvas.drawColor(0, PorterDuff.Mode.CLEAR);

    //try2
    Paint transparent = new Paint();
    transparent.setAlpha(0);
    canvas.drawPaint(transparent);

    //try3
    setImageResource(0);
}

我尝试以三种不同的方式清除 canvas/rect,如上面的代码所示,但它并没有改变输出,因为黑色矩形仍然可见。 我现在的问题是原因是什么?是因为我没有“更新”canvas 还是因为我尝试清除 canvas?

结果基本上应该是我只看到第一个imageview

在View.onDraw()中在Canvas上绘制形状是低级函数,在最后阶段直接改变显示器上的像素。所以,一旦你画了一些东西,就不可能擦掉它。它没有缓冲。屏幕上只剩下混合的 RGB(w/o A) 像素。以前的像素颜色(源自“takenPicture”)已经丢失。

如果您想使形状可擦除,请准备另一个由 ARGB 位图支持的 canvas 并在其上绘制所有形状。然后最后在canvas上绘制位图。

@Override
protected void onDraw(Canvas canvas)
{

    // Prepare Bitmap and Canvas 
    Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    Canvas draw_canvas = new Canvas(bitmap);

    // Draw a rect.
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setStrokeWidth(3);
    draw_canvas.drawRect(new Rect(212,0,-720,600),paint);

    // Clear
    draw_canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.SRC);

    // Draw the bitmap.
    canvas.drawBitmap(bitmap, 0, 0, null);
    bitmap.recycle();
}