我正在开发一个在画布上画一条透明线的功能,问题是,截图显示的线上有一些“球形”。
这是我的代码:
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;
}
非常感谢您的帮助
答案 0 :(得分:1)
球形是每个线段与前一个线段重叠的位置。您可以使用覆盖在您正在编辑的图像顶部的第二个图像来解决此问题。
将叠加图像初始化为完全透明,并使其与正在编辑的图像大小相同。
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
,请使用在setAlpha()
中设置的Alpha值,使用画布绘制调用将叠加图像绘制到目标图像上,然后将叠加图像清除为透明的。