2011-09-03 41 views
8

Tengo un panel que se coloca encima de otra vista mediante una aplicación relativa.lienzo transparente de Android (vista de superficie)

Me gustaría dar a este panel un fondo transparente, pero no encontré la forma correcta de hacerlo después de buscar algunas horas. Cuando vuelvo a poner el alfa en 0, termino con un fondo negro.

Espero que alguien aquí me pueda ayudar con esto.

¡Muchas gracias!

El panel se extrae a través de este código:

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); 
     } 
    } 
} 

Respuesta

2

Después de buscar con SurfaceView palabra clave en lugar de la lona II se observó que no es posible. Para obtener más información, consulte: how to make surfaceview transparent

Como el fondo del lienzo es estático, le di exactamente el mismo fondo. Ahora parece que es transparente :)

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

Prueba esto:

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

Gracias por su respuesta, pero lamentablemente esto no resolvió el problema. He colocado esta línea arriba y debajo de 'getHolder(). AddCallback (this);' pero el fondo se quedó en negro. – patrick

+0

uhmmm ... ¿qué tal eliminar el fondo con 'setBackgroundResource (0)' o en xml 'android: background =" @ null "' –

+0

Ferdy, gracias por su nueva sugerencia, pero desafortunadamente esto tampoco solucionó el problema. Esto mostró un fondo negro también. – patrick

4

copié la solución de la misma pregunta: how to make surfaceview transparent y tengo que trabajar con una configuración similar a la suya.

La pieza crítica para mí fue la configuración 'setZOrderOnTop (true)', que tontamente ignoré en la primera pasada. Lo puse en el constructor y configuré mi formato de píxel en RGBA_8888 dentro de SurfaceCreated.

En este punto, el fondo del diseño de nivel superior era visible.

+0

setZOrderOnTop (verdadero) es la pieza que falta del rompecabezas aquí, y es completamente no intuitiva. –

26

En el constructor:

setZOrderOnTop(true); 

Después holder.addCallback(this):

holder.setFormat(PixelFormat.TRANSPARENT); 

A principios del dibujo:

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

Esto ayudó. ¡Gracias! –

+0

¡Oh, esta es la respuesta! si las primeras llamadas hacen que el fondo sea transparente, la última línea también le permite dibujar bitmaps con nivel alfa – Giudark

+0

Gracias, pero el truco es demasiado bueno: 'setZOrderOnTop' hace que aparezca en la parte superior de la ventana. Así que ahora SurfaceView aparece sobre su fondo (que es perfecto para la transparencia), pero luego cuando arrastro mi Cajón de navegación, SurfaceView también se encuentra encima (en lugar de debajo), lo que se ve horrible. ¿Alguna idea? –

Cuestiones relacionadas