2012-05-02 2 views
5

Я пытаюсь достичь тех же результатов, что и в потоке: Make certain area of bitmap transparent on touch. Я придерживаюсь кода, представленного в этом ответе: Lumis answer и в соответствии с SteD это решение должно работать.Сделать определенную область растрового изображения прозрачным при касании -> снова

К сожалению, для меня не работает (а также для другого пользователя: Make certain area of bitmap transparent on touch doesn't works, it's draw a black circle), я просто получаю черный круг. Я пробовал много вещей, но не понял. Сделать фон прозрачным в соответствии с предложением из второго потока не имеет никакого значения.

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

android:theme="@android:style/Theme.Translucent" 

в моем AndroidManifest.xml я могу видеть все под моим приложением, т.е. рабочего стола. Я много раз проходил код и не вижу очевидной ошибки, только причина, о которой я думаю, это причина Z, но растровые изображения и холст не поддерживают z-ордера. Порядок Z выполняется путем рисования в определенном порядке (что является правильным в этом коде).

Это какой-то странный пример оптимизации в коде android, или я что-то пропустил в файле манифеста android?

ответ

6

Наконец я нашел решение, которое работает:

@Override 
public void onDraw(Canvas canvas){ 
    super.onDraw(canvas); 

    //draw background 
    canvas.drawBitmap(bgr, 0, 150, 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, 0, 0, null); 

    Paint new_paint = new Paint(/*Paint.ANTI_ALIAS_FLAG*/); 
    new_paint.setXfermode(new PorterDuffXfermode(Mode.SRC_ATOP)); 
    canvas.drawBitmap(overlay, 0, 0, new_paint); 
} 

Но я не понимаю, почему работает. Я был исследовать xfermodes с этим исходным кодом: android Xfermodes demo и в соответствии с этим изображением: Xfermodes image

Это не имеет никакого смысла, кроме что xfermode убедитесь, что наложение растрового изображения боб обращается второй (Z порядка) и прозрачность стали играть. Но порядок Z должен поддерживаться путем рисования.

Если у кого-то есть идея, как решить эту проблему, поделитесь своими знаниями.

С уважением.

+0

Paint new_paint = new Paint (/ * Paint.ANTI_ALIAS_FLAG * /); new_paint.setXfermode (новый PorterDuffXfermode (Mode.SRC_ATOP)); canvas.drawBitmap (overlay, 0, 0, new_paint); ================================================================================================================= = было главным, что решило его благодаря – ViVekH

2

вы можете редактировать метод OnDraw():

public void onDraw(Canvas canvas){ 
     super.onDraw(canvas); 
     canvas.drawColor(Color.TRANSPARENT); 
     canvas.drawBitmap(bgr, 0, 0, null); 

     c2.drawCircle(X, Y, 10, pTouch); 
     Paint new_paint = new Paint(/*Paint.ANTI_ALIAS_FLAG*/); 
     new_paint.setXfermode(new PorterDuffXfermode(Mode.SRC_ATOP)); 
     canvas.drawBitmap(overlay, 0, 0, new_paint); 
    } 

Я попробовал и это сработало! Надеемся, что это решение поможет вам

+0

спасибо чувак .. это помогло мне .. –

Смежные вопросы