微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

清除/重置整个 ImageView 画布

如何解决清除/重置整个 ImageView 画布

我有一个带有 2 个图像视图的简单布局:

<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) 是一个自定义ImageView (ExtendedImageView) (2) 它绘制一个显示在法线之上的画布图像视图。 这看起来像这样: displayimageviews

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

@Override
protected void onDraw(Canvas canvas) {

    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setstrokeWidth(3);
    canvas.drawRect(new Rect(212,-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);
}

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

最终的结果应该是我只看到了第一个 imageview

解决方法

在 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,-720,600),paint);

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。