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)是自定义的ImageView
(ExtendedImageView
)(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();
}
我有一个带有 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)是自定义的ImageView
(ExtendedImageView
)(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();
}