2011-09-03 149 views
8

我有一个面板放在另一个视图的顶部,通过一个相关布局。Android透明画布(surfaceview)

我想给这个面板一个透明的背景,但没有找到正确的方法来做这个搜索几个小时后。当我将alpha设置回0时,我会以黑色背景结束。

希望这里有人能帮助我。

非常感谢!

面板通过这个代码得出:

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

回答

2

与关键字surfaceview代替帆布II发现,这是不可能的搜索后。欲了解更多信息,请参阅:how to make surfaceview transparent

由于画布的背景是静态的,我给了它完全相同的背景。现在,它看起来是透明的:)

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

试试这个:

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

谢谢您的回答,但不幸的是这并没有解决问题。我把这行放在'getHolder()。addCallback(this)'的上面和下面,'但是背景保持黑色。 – patrick

+0

uhmmm ..如何删除背景'setBackgroundResource(0)'或xml'android:background =“@ null”' –

+0

Ferdy,感谢您的新建议,但不幸的是,这也没有解决问题。这也显示了黑色背景。 – patrick

4

我复制了同样的问题解决方案:how to make surfaceview transparent,得到它与你类似的设置工作。

对我来说关键的一点是'setZOrderOnTop(true)'设置,我在第一遍中愚蠢地忽略了这一点。我把它放在构造函数中,并将我的像素格式设置为surfaceCreated内的RGBA_8888。

此时,顶层布局的背景可见。

+0

setZOrderOnTop(true)是这里难题的一部分,它完全不直观。 –

26

在构造函数中:

setZOrderOnTop(true); 

holder.addCallback(this)

holder.setFormat(PixelFormat.TRANSPARENT); 

在拉制开始:

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

这有帮助。谢谢! –

+0

哦,这就是答案! 如果第一次调用使背景透明,最后一行还允许您绘制带有alpha级别的位图 – Giudark

+0

谢谢,它的确有个窍门,虽然有点太过分:'setZOrderOnTop'使它出现在窗口的最顶端。所以现在SurfaceView出现在它的背景之上(这对于透明度来说是完美的),但是当我拖动我的导航抽屉时,SurfaceView也处于顶部(而不是下面),这看起来很糟糕。任何想法? –