сделать часть изображения прозрачной, используя PorterDuffXfermode - PullRequest
0 голосов
/ 21 марта 2012

кто-нибудь, пожалуйста, помогите мне, я не знаю, где он идет не так, я попробовал все возможные вещи здесь, но появляется тот же черный патч .. не знаю, где я иду не так ...

первое изображение рисуется непосредственно на холсте, затем на объекте холста c2, я рисую изображение overlayDefault, накладываю на него краску, а затем снова на исходный холст я рисую таблицу overlay_mutable, полученную после использования

overlay_mutable = overlayDefault.copy(Config.ARGB_8888, true);

но изображение все равно нарисовано, но при нажатии появляется только черная полоса, а нижележащее изображение не видно !!

    public class PartTransparent extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new TouchView(this));
    }

    class TouchView extends View{
    Bitmap bgr;
    Bitmap overlayDefault;
    Bitmap overlay_mutable;
    Paint pTouch;
    int X = -100;
    int Y = -100;
    Canvas c2;

    public TouchView(Context context) {
        super(context);

        bgr = BitmapFactory.decodeResource(getResources(),R.drawable.mah_grp_pic);
        overlayDefault =     BitmapFactory.decodeResource(getResources(),R.drawable.z_oceanblue);
    overlay_mutable = overlayDefault.copy(Config.ARGB_8888, true);  // convert to ARGB_8888 format,only den can it be put on canvas in next line..
    c2 = new Canvas();
    c2.setBitmap(overlay_mutable);
    c2.drawBitmap(overlayDefault, 0, 0, null);

    pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);         
    pTouch.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 
    pTouch.setAlpha(0);
    pTouch.setColor(Color.TRANSPARENT);
    pTouch.setMaskFilter(new BlurMaskFilter(15, Blur.NORMAL));  // Blur modes

}

@Override
public boolean onTouchEvent(MotionEvent ev) {

    switch (ev.getAction()) {

        case MotionEvent.ACTION_DOWN: {

            X = (int) ev.getX();
            Y = (int) ev.getY();
            invalidate();
            break;
        }
        case MotionEvent.ACTION_MOVE: {
                X = (int) ev.getX();
                Y = (int) ev.getY();
                invalidate();
                break;
        }           
        case MotionEvent.ACTION_UP:
            break;
    }
    return true;
}

@Override
public void onDraw(Canvas canvas){
    canvas.drawBitmap(bgr, 0, 0, null);
    //copy the default overlay into temporary overlay and punch a hole in it                          
    c2.drawBitmap(overlayDefault, 0, 0, null); //exclude this line to show all as you draw
    c2.drawCircle(X, Y, 80, pTouch);
    //draw the overlay over the background  
    canvas.drawBitmap(overlay_mutable, 0, 0, null);
    super.onDraw(canvas);
}
}

Ответы [ 2 ]

2 голосов
/ 15 марта 2013

[Отвечая на свой вопрос, я уже отвечал в разделе комментариев ранее)

заменить

overlay_mutable = overlayDefault.copy (Config.ARGB_8888, true); "

с

overlay_mutable = Bitmap.createBitmap (ширина, высота, Config.ARGB_8888); * * +1012

0 голосов
/ 19 июня 2017

overlay_mutable = overlayDefault.copy(Config.ARGB_8888, true); создает растровое изображение с альфа-каналом, но hasAlpha() вернет false.

Так что все, что вам нужно сделать, это вызвать setHasAlpha(true) для растрового изображения, созданного с помощью копии (overlay_mutable).

...