清除/重置整个 ImageView 画布

Clear/Reset entire ImageView canvas

提问人:Funny Moments 提问时间:5/1/2021 更新时间:5/2/2021 访问量:490

问:

我有一个简单的布局,有 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 显示一个位图,第二个 (1) 是自定义 () (2),它绘制一个画布,该画布显示在普通 ImageView 之上。 这看起来像这样:displayimageviewsImageViewImageViewExtendedImageView

我想要的是,在我的方法中绘制矩形后,我想再次清除矩形(现在仅用于测试目的)。这是我的代码的样子: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);
}

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

最终结果基本上应该是我只看到第一个图像视图

Android Canvas android-imageview android-drawable ondraw

评论


答:

0赞 ardget 5/2/2021 #1

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

如果要使形状可擦除,请准备另一个由 ARGB 位图支持的画布,并在其上绘制所有内容。最后在画布上绘制位图。

@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();
}

评论

0赞 Funny Moments 5/3/2021
无论如何,有没有一些“更干净”的处理绘图等方式?还是覆盖 OnDraw 是唯一的选择?
0赞 ardget 5/3/2021
由于不清楚你将如何发展,所以要给你具体的答案并不容易。但一般来说,创建自定义 Drawable 类可能是常见的做法。如果性能无关紧要,则无需使用位图来缓存图形。请参阅 Drawable 文档并找到满足您要求的解决方案。