Как стереть (сделать прозрачным) один пользовательский регион на холсте Android?
Я перезаписываю Android ImageView, чтобы углы моего изображения были прозрачными. Я могу сделать это, обрезав холст в моем onDraw(Canvas canvas):
@Override
protected void onDraw(Canvas canvas) {
Path clipPath = new Path();
int w = this.getWidth();
int h = this.getHeight();
clipPath.addRoundRect(new RectF(0,0,w,h), 10.0f, 10.0f, Path.Direction.CW);
canvas.clipPath(clipPath);
super.onDraw(canvas);
}
К сожалению, сглаживание этого круглого прямоугольника невозможно, и в результате получаются такие уродливые углы:
Я знаю, что могу очистить части моего холста с помощью сглаживания, используя Paint
а также PorterDuff.Mode.CLEAR
что я не знаю, так это указать закругленные углы как область, которую нужно стереть. Я ищу что-то вроде этого:
@Override
protected void onDraw(Canvas canvas) {
//superclass will draw the bitmap accordingly
super.onDraw(canvas);
final Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
//this will erase a round rectangle, I need the exact inverse
canvas.drawRoundRect(rect, rx, ry, paint);
}
Есть ли способ "стереть" не круглый прямоугольник, а обратный, то есть круглые углы? А что, если я просто хочу стереть один из углов?
1 ответ
Рисуйте, используя BitmapShader с прозрачным цветом для вашего объекта Paint.
Если вы просто хотите стереть один из углов, попробуйте нарисовать его как контур вместо RoundRect.
protected void onDraw(Canvas canvas) {
BitmapShader bitmapShader = new BitmapShader(<original drawable>, TileMode.CLAMP, TileMode.CLAMP);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(0xFF000000);
paint.setShader(bitmapShader);
canvas.drawRoundRect(rect, rx, ry, paint);
}