2011-09-03 12 views
8

Mam panel, który jest umieszczony na innym widoku za pomocą opcji względnej.Przeźroczyste płótno z Androidem (widok powierzchni)

Chciałbym nadać temu panelowi przejrzyste tło, ale nie znalazłem właściwego sposobu, aby to zrobić po wyszukaniu kilku godzin. Kiedy ustawię alfa z powrotem na 0, otrzymam czarne tło.

Mam nadzieję, że ktoś tutaj może mi w tym pomóc.

Wielkie dzięki!

Panel jest sporządzony za pomocą tego kodu:

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

Odpowiedz

2

Po wyszukaniu ze słowem kluczowym surfaceview zamiast płótna II okazało się, że nie jest to możliwe. Aby uzyskać więcej informacji, zobacz: how to make surfaceview transparent

Ponieważ tło płótna jest statyczne, nadałem mu dokładnie to samo tło. Teraz wygląda na to, że jest przezroczysty :)

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

Spróbuj tego:

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

dziękuję za odpowiedź, ale niestety to nie rozwiązuje problem. Umieściłem ten wiersz powyżej i poniżej 'getHolder(). AddCallback (this);' ale tło pozostało czarne. – patrick

+0

uhmmm .. co z usuwaniem tła z 'setBackgroundResource (0)' lub w xml 'android: background =" @ null "' –

+0

Ferdy, dzięki za twoją nową sugestię, ale niestety to też nie rozwiąże problemu. To również miało czarne tło. – patrick

4

skopiowane rozwiązanie z tym samym pytaniem: how to make surfaceview transparent i dostał go do pracy w konfiguracji podobnej do twojej.

Najważniejszym dla mnie elementem było ustawienie "setZOrderOnTop (true)", którego nierozważnie zignorowałem podczas pierwszego przejścia. Umieściłem to w konstruktorze i ustawiłem format pikseli na RGBA_8888 wewnątrz surfaceCreated.

W tym momencie widoczne było tło z układu najwyższego poziomu.

+0

setZOrderOnTop (true) to brakujący element układanki i jest całkowicie nieintuicyjny. –

26

W konstruktorze:

setZOrderOnTop(true); 

Po holder.addCallback(this):

holder.setFormat(PixelFormat.TRANSPARENT); 

Na początku rysunku:

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

To pomogło. Dziękuję Ci! –

+0

Och, to jest odpowiedź! jeśli pierwsze połączenia sprawiają, że tło jest przezroczyste, ostatnia linia pozwala również narysować bitmapy z poziomem alfa – Giudark

+0

Dzięki, to działa, trochę zbyt dobrze jednak: 'setZOrderOnTop' sprawia, że ​​pojawia się w górnej części okna. Teraz SurfaceView pojawia się nad jego tłem (co jest idealne dla przezroczystości), ale kiedy przeciągam moją szufladę nawigacyjną, również SurfaceView jest na niej (zamiast na dole), co wygląda okropnie. Dowolny pomysł? –