Android прозрачный холст (поверхность) - PullRequest
8 голосов
/ 03 сентября 2011

У меня есть панель, которая размещается поверх другого вида с помощью относительной разметки.

Я хотел бы дать этой панели прозрачный фон, но не нашел правильного способа сделать это послеищу несколько часов.Когда я устанавливаю альфа обратно в 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);
        }
    }
}

Ответы [ 4 ]

26 голосов
/ 08 апреля 2013

В конструкторе:

setZOrderOnTop(true);

После holder.addCallback(this):

holder.setFormat(PixelFormat.TRANSPARENT);

В начале рисунка:

canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
4 голосов
/ 02 декабря 2011

Я скопировал решение из того же вопроса: как сделать прозрачность поверхности и заставил его работать с настройкой, аналогичной вашей.

Критическим для меня был параметр setZOrderOnTop (true), который я по глупости проигнорировал при первом проходе. Я помещаю это в конструктор и устанавливаю свой пиксельный формат RGBA_8888 внутри SurfaceCreated.

В этот момент фон из макета верхнего уровня был виден.

3 голосов
/ 03 сентября 2011

Попробуйте это:

getHolder().setFormat(PixelFormat.TRANSLUCENT);
2 голосов
/ 04 сентября 2011

После поиска по ключевым словам SurfaceView вместо Canvas я обнаружил, что это невозможно. Для получения дополнительной информации см .: Как сделать поверхность прозрачной

Поскольку фон холста статичен, я дал ему точно такой же фон. Теперь это выглядит прозрачно :) 1005 *

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