在 android 中设置绘图的不透明度 canvas
Setting the opacity of drawing canvas in android
我正在开发一个函数,在 canvas 上绘制一些透明线,问题是,如屏幕截图所示,在线上有一些 "ball shape"。
这是我的代码:
canvas = new Canvas(alteredBitmap);
paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(width);
paint.setColor(color);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setAlpha(alpha);
matrix_draw = new Matrix();
canvas.drawBitmap(bmp, matrix_draw, paint);
setImageBitmap(alteredBitmap);
按下按钮设置 alpha
public void setAlpha(int alpha) {
this.alpha = alpha;
paint.setAlpha(alpha);
}
和听众
drawListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downx = getPointerCoords(event)[0];// event.getX();
downy = getPointerCoords(event)[1];// event.getY();
break;
case MotionEvent.ACTION_MOVE:
upx = getPointerCoords(event)[0];// event.getX();
upy = getPointerCoords(event)[1];// event.getY();
canvas.drawLine(downx, downy, upx, upy, paint);
invalidate();
downx = upx;
downy = upy;
break;
case MotionEvent.ACTION_UP:
// upx = getPointerCoords(event)[0];// event.getX();
// upy = getPointerCoords(event)[1];// event.getY();
// canvas.drawLine(downx, downy, upx, upy, paint);
// invalidate();
break;
case MotionEvent.ACTION_CANCEL:
break;
default:
break;
}
return true;
}
};
final float[] getPointerCoords(MotionEvent e) {
final int index = e.getActionIndex();
final float[] coords = new float[] { e.getX(index), e.getY(index) };
Matrix matrix = new Matrix();
getImageMatrix().invert(matrix);
matrix.postTranslate(getScrollX(), getScrollY());
matrix.mapPoints(coords);
return coords;
}
非常感谢您的帮助
球形是每条线段与前一条线段重叠的地方。您可以通过使用覆盖在您正在编辑的图像之上的第二个图像来解决此问题。
将叠加图像初始化为完全透明,并使其与您正在编辑的图像大小相同。
ImageView overlayImageView = findViewById(R.id.overlay);
Bitmap overlayBitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
overlayBitmap.erase(0x00000000); // transparent
overlayImageView.setImageBitmap(overlayBitmap);
在 setAlpha()
中将叠加图像的 alpha 设置为 alpha 值。
overlayImageView.setImageAlpha((float)alpha / 255.0f);
当用户画线时,在 case MotionEvent.ACTION_MOVE
块中,将线画到叠加图像上,但要完全不透明。因为所有线段都是在完全不透明的情况下绘制的,所以它们重叠的地方不会有任何球形,但由于应用于叠加图像的 alpha 值,该线仍然会显得透明。
在 MotionEvent.ACTION_UP
的情况下,通过使用 canvas 绘图调用将叠加图像绘制到目标图像上,使用 setAlpha()
中设置的 alpha 值,将线条转移到图像上,并且然后将叠加图像清除为透明。
我正在开发一个函数,在 canvas 上绘制一些透明线,问题是,如屏幕截图所示,在线上有一些 "ball shape"。
这是我的代码:
canvas = new Canvas(alteredBitmap);
paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(width);
paint.setColor(color);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setAlpha(alpha);
matrix_draw = new Matrix();
canvas.drawBitmap(bmp, matrix_draw, paint);
setImageBitmap(alteredBitmap);
按下按钮设置 alpha
public void setAlpha(int alpha) {
this.alpha = alpha;
paint.setAlpha(alpha);
}
和听众
drawListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
downx = getPointerCoords(event)[0];// event.getX();
downy = getPointerCoords(event)[1];// event.getY();
break;
case MotionEvent.ACTION_MOVE:
upx = getPointerCoords(event)[0];// event.getX();
upy = getPointerCoords(event)[1];// event.getY();
canvas.drawLine(downx, downy, upx, upy, paint);
invalidate();
downx = upx;
downy = upy;
break;
case MotionEvent.ACTION_UP:
// upx = getPointerCoords(event)[0];// event.getX();
// upy = getPointerCoords(event)[1];// event.getY();
// canvas.drawLine(downx, downy, upx, upy, paint);
// invalidate();
break;
case MotionEvent.ACTION_CANCEL:
break;
default:
break;
}
return true;
}
};
final float[] getPointerCoords(MotionEvent e) {
final int index = e.getActionIndex();
final float[] coords = new float[] { e.getX(index), e.getY(index) };
Matrix matrix = new Matrix();
getImageMatrix().invert(matrix);
matrix.postTranslate(getScrollX(), getScrollY());
matrix.mapPoints(coords);
return coords;
}
非常感谢您的帮助
球形是每条线段与前一条线段重叠的地方。您可以通过使用覆盖在您正在编辑的图像之上的第二个图像来解决此问题。
将叠加图像初始化为完全透明,并使其与您正在编辑的图像大小相同。
ImageView overlayImageView = findViewById(R.id.overlay);
Bitmap overlayBitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888);
overlayBitmap.erase(0x00000000); // transparent
overlayImageView.setImageBitmap(overlayBitmap);
在 setAlpha()
中将叠加图像的 alpha 设置为 alpha 值。
overlayImageView.setImageAlpha((float)alpha / 255.0f);
当用户画线时,在 case MotionEvent.ACTION_MOVE
块中,将线画到叠加图像上,但要完全不透明。因为所有线段都是在完全不透明的情况下绘制的,所以它们重叠的地方不会有任何球形,但由于应用于叠加图像的 alpha 值,该线仍然会显得透明。
在 MotionEvent.ACTION_UP
的情况下,通过使用 canvas 绘图调用将叠加图像绘制到目标图像上,使用 setAlpha()
中设置的 alpha 值,将线条转移到图像上,并且然后将叠加图像清除为透明。