2011-09-03 12 views
8

Ho un pannello che viene posizionato sopra un'altra vista tramite un relativelayout.Tela trasparente Android (vista d'insieme)

Vorrei dare a questo pannello uno sfondo trasparente, ma non ho trovato il modo corretto di farlo dopo aver cercato alcune ore. Quando imposto l'alpha su 0, finisco con uno sfondo nero.

Speriamo che qualcuno qui possa aiutarmi con questo.

Grazie mille!

Il pannello viene disegnata tramite questo codice:

import android.content.Context; 
    import android.graphics.Canvas; 
    import android.graphics.Paint; 
    import android.util.AttributeSet; 
    import android.view.SurfaceHolder; 
    import android.view.SurfaceView; 

    public class Panel extends SurfaceView implements SurfaceHolder.Callback { 

    private ViewThread mThread; 

    Paint paint = new Paint(); 

    public Panel(Context context, AttributeSet attributeSet) { 
     super(context, attributeSet); 
     getHolder().addCallback(this); 
     mThread = new ViewThread(this); 
    } 

    public void doDraw(Canvas canvas) { 
     canvas.drawARGB(50, 120, 120, 120); 

     paint.setARGB(255, 255, 0, 0); 
     paint.setStrokeWidth(2); 

     int CanvasHeight = canvas.getHeight(); 
     int CanvasWidth = canvas.getWidth(); 

     canvas.drawLine(LeftStartX, LeftStartY, StopX, StopY, paint); 
    } 

    public void updateDrawing(float LB, float RB, float BD, float AH, float AD){ 
     Left = LB; 
     Right = RB; 
     Distance = BD; 
     AHeight = AH; 
     ADistance = AD; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} 


    public void surfaceCreated(SurfaceHolder holder) { 
     if (!mThread.isAlive()) { 
      mThread = new ViewThread(this); 
      mThread.setRunning(true); 
      mThread.start(); 
     } 
    } 


    public void surfaceDestroyed(SurfaceHolder holder) { 
     if (mThread.isAlive()) { 
      mThread.setRunning(false); 
     } 
    } 
} 

risposta

2

Dopo la ricerca con parola chiave SurfaceView invece di tela iI scoperto che non è possibile. Per ulteriori informazioni vedere: how to make surfaceview transparent

Poiché lo sfondo della tela è statico, ho dato lo stesso identico sfondo. Ora sembra che sia trasparente :)

Bitmap bg = BitmapFactory.decodeResource(getResources(), R.drawable.background_panel_800_480); 
    canvas.drawBitmap(bg, 0, 0, null); 
3

Prova questa:

getHolder().setFormat(PixelFormat.TRANSLUCENT); 
+0

Grazie per la risposta, ma purtroppo questo non ha risolto il problema. Ho inserito questa riga sopra e sotto 'getHolder(). AddCallback (this);' ma lo sfondo è rimasto nero. – patrick

+0

uhmmm .. per quanto riguarda la rimozione dello sfondo con 'setBackgroundResource (0)' o in xml 'android: background =" @ null "' –

+0

Ferdy, grazie per il tuo nuovo suggerimento, ma sfortunatamente questo non ha risolto il problema. Questo ha mostrato anche uno sfondo nero. – patrick

4

ho copiato la soluzione dalla stessa domanda: how to make surfaceview transparent e ottenuto di lavorare con una configurazione simile al tuo.

Il pezzo fondamentale per me era l'impostazione "setZOrderOnTop (true)", che ho stupidamente ignorato al primo passaggio. L'ho messo nel costruttore e ho impostato il mio formato pixel su RGBA_8888 all'interno di surfaceCreated.

A questo punto, lo sfondo dal layout di livello superiore era visibile.

+0

setZOrderOnTop (true) è il pezzo mancante del puzzle qui, ed è completamente non intuitivo. –

26

Nel costruttore:

setZOrderOnTop(true); 

Dopo holder.addCallback(this):

holder.setFormat(PixelFormat.TRANSPARENT); 

All'inizio del disegno:

canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
+0

Questo ha aiutato. Grazie! –

+0

Oh, questa è la risposta! se le prime chiamate rendono lo sfondo trasparente, l'ultima linea consente anche di disegnare bitmap con livello alfa – Giudark

+0

Grazie, fa il trucco, un po 'troppo bene però: 'setZOrderOnTop' lo fa apparire nella parte superiore della finestra. Così ora SurfaceView appare sopra il suo sfondo (che è perfetto per la trasparenza), ma poi quando trascino il mio Navigation Drawer il SurfaceView è anche sopra di esso (anziché sotto), che sembra orribile. Qualche idea? –

Problemi correlati