Android透明画布(surfaceview)

Android透明画布(surfaceview),android,transparency,android-canvas,draw,Android,Transparency,Android Canvas,Draw,我有一个面板,它通过一个相对线放在另一个视图的顶部 我想给这个面板一个透明的背景,但在搜索了几个小时后没有找到正确的方法。当我将alpha设置回0时,我最终会得到一个黑色背景 希望这里有人能帮我 非常感谢 通过以下代码绘制面板: import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.util.Attr

我有一个面板,它通过一个相对线放在另一个视图的顶部

我想给这个面板一个透明的背景,但在搜索了几个小时后没有找到正确的方法。当我将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);
        }
    }
}
试试这个:

getHolder().setFormat(PixelFormat.TRANSLUCENT);

用关键字surfaceview而不是canvas iI搜索后,发现这是不可能的。有关更多信息,请参阅:

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


我从同一个问题中复制了解决方案:并使其与您的设置类似

对我来说最关键的是“setZOrderOnTop(true)”设置,我在第一次通过时愚蠢地忽略了它。我将其放入构造函数中,并将我的像素格式设置为RGBA_8888 inside surfaceCreated

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

在构造器中:

setZOrderOnTop(true);
在holder.addCallback(this)之后:

在绘图开始时:

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

谢谢你的回答,但不幸的是,这并没有解决问题。我把这一行放在
getHolder().addCallback(this)的上面和下面但背景一直是黑色的。嗯。。使用
setBackgroundResource(0)
或在xml
android:background=“@null”
Ferdy中删除背景怎么样,谢谢你的新建议,但不幸的是,这也没有解决问题。这也显示了一个黑色背景。setZOrderOnTop(true)是拼图中缺失的部分,它完全不直观。这很有帮助。非常感谢。哦,这就是答案!如果第一个调用使背景透明,那么最后一行还允许您使用alpha级别绘制位图。谢谢,它的效果有点太好了:
setZOrderOnTop
使其显示在窗口的最顶部。因此,现在SurfaceView显示在其背景上方(这非常有利于透明度),但当我拖动导航抽屉时,SurfaceView也显示在其上方(而不是下方),这看起来很糟糕。有什么想法吗?@Dadou也有同样的问题,你找到解决办法了吗?我花了好几天的时间想弄明白。非常感谢你!!
holder.setFormat(PixelFormat.TRANSPARENT);
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);