【问题标题】:Android overlaying GLSurfaceView with camera's SurfaceViewAndroid 用相机的 SurfaceView 覆盖 GLSurfaceView
【发布时间】:2013-04-13 19:52:22
【问题描述】:

我希望在相机顶部放置一个 openGL 模型(通过 GLSurfaceView),它有自己的 SurfaceView。这肯定是可能的,像 Layar 这样的应用程序就是这样做的。

这是我正在尝试的:

public class MainActivity extends Activity {


    private CameraSurfaceView mCameraSurfaceView; 
    private GLSurfaceView mCubeGLSurfaceView; 
    private FrameLayout mFrameLayout; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        mFrameLayout = new FrameLayout(this); 

        mCameraSurfaceView = new CameraSurfaceView(this);

        mCubeGLSurfaceView = new GLSurfaceView(this);
        mCubeGLSurfaceView.setRenderer(new CubeRenderer()); 
        //mCubeGLSurfaceView.setZOrderMediaOverlay(true);

        mFrameLayout.addView(mCameraSurfaceView); 
        mFrameLayout.addView(mCubeGLSurfaceView); 

        setContentView(mFrameLayout); 

    }

}

现在:只是摄像头出现了。我在网上阅读了有关 GLSurfaceView 的 SetZOrderMediaOverlay 属性;在上面的代码中将其设置为 TRUE 会使 3D 立方体显示为黑色背景(即不显示相机预览)。

参考文献:

我尝试过的其他测试:更改各个表面视图的 addView 顺序无济于事;它只显示相机(我在某处读到更改 addView 顺序可能会有所帮助)。

感谢您的帮助!

【问题讨论】:

    标签: java android opengl-es


    【解决方案1】:

    由于您声明当前只有相机预览可见,因此您可能没有正确排序视图。这就是我为创造你想要的东西所做的。

    在Activity中创建 派生自 GLSurfaceView 的 MySurfaceView 实例 派生自 SurfaceView 的 MyCameraPreview 实例

    在我的 Activity 的 onCreate 方法中,我执行以下操作:

    mySurfaceView = new MySurfaceView(this);
    addContentView(mySurfaceView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    myCameraPreview = new MyCameraPreview(this, myCamera);
    addContentView(myCameraPreview, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
    

    请注意,使用此方法您不使用布局 xml。

    这将创建您的两个视图,并在后台使用相机预览。

    现在您需要让 MySurfaceView 绘制透明背景,以便相机预览显示在您渲染的对象后面。如果您使用的是 OpenGL ES 2.0,请将其添加到 MySurfaceView 类的构造函数中。

    setEGLContextClientVersion(2);
    setEGLConfigChooser(8,8,8,8,16,0);
    getHolder().setFormat(PixelFormat.TRANSLUCENT);
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    

    我自己刚刚完成了这个过程,所以我可能遗漏了一些细节。

    【讨论】:

    • 你以为你一次只能有一个 SurfaceView 吗?
    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多