Невозможно изменить растровое изображение, чтобы оно было прозрачным в Android - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь нарисовать прозрачный круг на растровом изображении в Android.У меня есть три основные переменные:

        mask = Bitmap.createBitmap(this.getWidth(),this.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas can = new Canvas(mask);
        Paint clear = new Paint();

Если я сделаю следующее, я получу ожидаемые результаты:

clear.setColor(Color.TRANSPARENT);
can.drawRect(new Rect(0,0,this.getWidth(),this.getHeight()),clear);

enter image description here

Однако, если я сначала нарисую что-то еще на холсте, а затем попытаюсь очистить его с помощью прозрачности, старые данные останутся.Например:

clear.setColor(Color.argb(255,255,0,0));
can.drawRect(new Rect(0,0,this.getWidth(),this.getHeight()),clear);
clear.setColor(Color.TRANSPARENT);
can.drawRect(new Rect(0,0,this.getWidth(),this.getHeight()),clear);

enter image description here

Я вижу только гигантский красный квадрат.Две нижние строки должны «стереть» закрашенный красный, чтобы сделать его снова прозрачным.В конечном итоге маска рисуется на другом холсте следующим образом:

@Override
public void onDraw(Canvas c)
{
    c.drawBitmap(mask,0,0,null);

    super.onDraw(c);
}

1 Ответ

0 голосов
/ 30 ноября 2018

Как оказалось, это имеет отношение к объекту Paint и установке Xfermode ...

    mask = Bitmap.createBitmap(this.getWidth(),this.getHeight(), 
    Bitmap.Config.ARGB_8888);
    Canvas can = new Canvas(mask);

    Paint clear = new Paint();
    clear.setColor(Color.argb(255,255,0,0));
    can.drawRect(new Rect(0,0,this.getWidth(),this.getHeight()),clear);

    PorterDuffXfermode xfer = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
    clear.setXfermode(xfer);
    clear.setColor(Color.TRANSPARENT);
    can.drawCircle(this.getWidth()/2, this.getHeight()/2, this.getHeight()/2, clear);

enter image description here

...