Как стереть (сделать прозрачным) один пользовательский регион на холсте 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);

}
Другие вопросы по тегам