像许多其他人一样,我试图在相机预览(使用SurfaceView)上绘制3D对象(使用GLSurfaceView),并在顶部放置一些按钮.我实际上有一个原型工作,但我无法让onResume正常工作.在简历之后,GLSurfaceView会留在后面并且不再可见.我知道它正在工作,因为如果我从布局中删除SurfaceView,我可以看到绘图很好.
目标是Nexus One,运行库存2.3.3 ROM.
这是布局xml:
<com.example.cameratest.GLPreview
android:id="@+id/cubes"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<com.example.cameratest.Preview
android:id="@+id/camera"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/buttongroup"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="right" android:gravity="center">
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:id="@+id/buttonClose"></Button>
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:id="@+id/buttonMode"></Button>
<Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:id="@+id/buttonCameraInfo"></Button>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
<merge><code>
所有这些都包含在一个Preview块中,但出于某种原因,我无法将其包含在上面的SurfaceView列表中.setZOrderMediaOverlay()是扩展GLSurfaceView和实现相机预览逻辑的类.
这在活动启动时工作正常.在我启动另一个活动(例如,按下其中一个按钮)并完成该活动后,主活动将恢复,但3D对象不再可见.
我发现这个讨论的地方setZOrderMediaOverlay()有助于解决这个z排序问题.此外,setZOrderMediaOverlay()的Android文档说"在将表面视图的包含窗口附加到窗口管理器之前"应该调用此函数.我不知道如何解释该语句,因此我将调试语句放在代码中以查看事件序列.这是onResume()代码的样子:
public class GLPreview extends GLSurfaceView
{
private static final String TAG = "GLPreview";
public GLPreview(Context context, AttributeSet attrs)
{
super(context, …Run Code Online (Sandbox Code Playgroud)