2010-03-17 24 views
8

Ho un oggetto Bitmap e voglio renderlo su un oggetto Canvas con vari livelli di traslucenza (cioè rendere parzialmente visibile l'intera bitmap). Ad esempio, ho sprite in un gioco (disegnato sopra la parte superiore di uno sfondo bitmap) che voglio sfumare dall'essere opaco all'essere invisibile. Posso farlo senza dover ricorrere a OpenGL?Disegno di bitmap traslucidi con Canvas (Android)

risposta

-1

Esame del documento di Android (che sembra basata su JSE con un'interfaccia grafica completamente alternativa), di seguito ti porterà un'immagine canale alfa di supporto:

Bitmap bmp=createBitmap(100,100,Bitmap.Config.ARGB_8888); 

Finché la fonte bitmap è l'alfa supportando, dovresti essere in grado di dipingerlo su un'altra bitmap e avere i valori alpha onorati.

Per sfumare, è necessario colorare ripetutamente l'immagine con un ritardo adeguato (ma l'evento viene eseguito da un timer, non in un ciclo, a meno che il sistema di rendering di Android non sia molto diverso dagli altri Javas) che manipola il canale alfa per ogni pixel su ogni vernice successiva.

// Make image more transparent by 50% 
int[] pxls=new int[100*100]; 
bmp.getPixels(pxls,0,100,0,0,100,100); 
for(int xa=0,len=pxl.length; xa<len; xa++) { 
    int alp=(pxls[xa] & 0xFF000000); 
    alp<<1; 
    pxls[xa]=(alp | (pxls[xa] & 0x00FFFFFF); 
    } 
bmp.setPixels(pxls,0,100,0,0,100,100); 

Caveat 1: Ho scritto questo codice in-situ dal JavaDoc; non è stato compilato o testato

Avvertimento 2: Se la risoluzione del colore dispositivo hardware non supporta un canale alfa (comunemente noto come colore a 32 bit), verniciatura delle immagini nel sistema grafico sottostante possono semplicemente ignorare il canale alfa). Ma qualsiasi compositing fatto prima su un'immagine back-buffer dovrebbe essere rispettato. Il punto è che tu puoi avere per usare la pittura a doppio buffer per eseguire l'alfa blending pur essendo immune alle funzionalità/config del dispositivo sottostante.

+0

Grazie per il codice. Conosco questo metodo ma eseguo il loop su alcuni folletti piccoli come questo ogni frame distruggerà il mio framerate. Ho scritto codice come questo prima ed è molto lento il looping e la manipolazione dei singoli pixel. Ci deve essere un modo più semplice perché diversi elementi della GUI hanno effetti di dissolvenza rapida. – wordyword

12

Dovresti essere in grado di definire un'animazione di interpolazione e applicare tale animazione a un'immagine. La risorsa XML sarebbe simile al seguente (chiamato fade_animation.xml):

<?xml version="1.0" encoding="utf-8"?> 
<alpha xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/linear_interpolator" 
    android:fromAlpha="1.0" 
    android:toAlpha="0.0" 
    android:duration="100" /> 

allora si caricherebbe e applicare questa animazione al tuo IMAGEVIEW personalizzato quando è pronto:

ImageView sprite = (ImageView) findViewById(R.id.sprite); 
Animation animation = AnimationUtils.loadAnimation(this, R.anim.fade_animation); 
sprite.startAnimation(animation); 

Ci sono altre opzioni pure. Se si utilizza bitmap e non si vuole fare un'animazione, allora è possibile diminuire manualmente il valore alfa di ciascun fotogramma, un po 'come questo:

paint.setAlpha(100); 
canvas.drawBitmap(spriteImage, left, top, paint); 

Hai provato una di queste opzioni?