Как стереть (сделать прозрачным) один пользовательский регион на холсте Android? - PullRequest
4 голосов
/ 14 февраля 2012

Я перезаписываю 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);
}

К сожалению, сглаживание этого круглого прямоугольника невозможно, и в результате получаются ужасные углы, подобные этому:

enter image description here

Я знаю, что могу очистить части моего холста с помощью сглаживания, используя 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 Ответ

4 голосов
/ 14 февраля 2012

Рисование с использованием 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);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...