【问题标题】:Android SurfaceView overlay on camera view does not show when preview is on预览打开时,相机视图上的 Android SurfaceView 覆盖不显示
【发布时间】:2012-09-02 15:12:32
【问题描述】:

我有一个包含两个 SurfaceView 的 FrameLayout。其中一个将显示相机预览,另一个是我用于绘图的自定义表面视图。问题是没有显示表面视图。如果我注释掉相机开始预览的行,它会在黑色背景上进行。这表明 Surface 视图定位良好,但我怀疑在绘制相机预览时出现问题。

相机视图:

public CameraView(Context context, AttributeSet a) {
    super(context, a);
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

自定义视图:

public InclinaisonGauge(Context context, AttributeSet attrs) {
    super(context, attrs);
    getHolder().addCallback(this);
    getHolder().setFormat(PixelFormat.TRANSLUCENT);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    run = true;
    updateThread = new Thread()
    {
        public void run()
        {
            Canvas c = null;
            final SurfaceHolder inclHolder = getHolder();
            while (run) {
                try {
                    c = inclHolder.lockCanvas();
                    if(c!=null)
                    {
                        synchronized (inclHolder) {
                            onDraw(c);
                        }
                    }
                } finally {
                // do this in a finally so that if an exception is thrown
                // during the above, we don't leave the Surface in an
                // inconsistent state
                if (c != null) {
                    inclHolder.unlockCanvasAndPost(c);
                }
            }           
        }
    }
};

我在自定义视图上使用这个非常简单的绘制方法来确保它不是帧率问题

public void doDraw(final Canvas canvas, final boolean bigSize, float daDirection)
{
    canvas.drawARGB(255, 255, 255, 255);
}

有人经历过吗?

谢谢

【问题讨论】:

  • 这是一个显示问题的简单项目 - dl.free.fr/f4rt18a1o。启动它,您将只看到相机。在 CameraView 中,注释掉它开始预览的那一行,你会看到 SurfaceView 正在被绘制。

标签: java android camera overlay surfaceview


【解决方案1】:

好的,如果其他人得到这个,解决方案是在surfaceView上调用它

this.setZOrderMediaOverlay(true);

【讨论】:

    【解决方案2】:

    我不认为 SurfaceViews 旨在用作叠加层,但可以实现这种行为。您要做的是在创建 SurfaceView 类时:

        setZOrderMediaOverlay(true);
        getHolder().setFormat(PixelFormat.TRANSPARENT);
    

    【讨论】:

    • 这是我的解决方案。 setZOrderMediaOverlay 还不够。我相信这应该是公认的答案
    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    相关资源
    最近更新 更多