我为Android制作了一个基本的3D游戏,想要添加一个HUD。我该怎么做?是否可以添加一个位于3D游戏顶部的布局,或者我必须使用OpenGL执行此操作?
答案 0 :(得分:2)
可以在openGL布局上添加一个或多个布局。要做到这一点,你必须从RelativeLayout开始。它将包含OpenGL和Hud布局。声明顺序很重要(首先声明,首先渲染)。要更改Hud布局的位置,可以使用layout_margin属性,如果是完整叠加,则使用match_parent。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- START of OpenGL Layout -->
<LinearLayout
android:id="@+id/openGLLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="0dp"
android:layout_marginTop="0dp" >
</LinearLayout>
<!-- END of OpenGL Layout -->
<!-- START of HUD Layout -->
<LinearLayout
android:id="@+id/hudLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="50dp"
android:layout_marginTop="50dp">
<TextView
android:id="@+id/hudText"
android:text="Hud Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</TextView>
</LinearLayout>
<!-- END of HUD Layout -->
</RelativeLayout>
在此示例中,OpenGL布局是用作容器的empy LinearLayout。我通过代码将自己的GLSurfaceView添加到此RelativeLayout:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
setContentView( R.layout.main );
MyOpenGLSurfaceView view = new MyOpenGLSurfaceView( getApplication() );
LinearLayout openGLLayout = (LinearLayout)findViewById(R.id.openGLLayout);
openGLLayout.addView(mView);
}
我主要使用此方法确认弹出窗口或上下文菜单。这样我就不必使用openGL创建自己的按钮了。
答案 1 :(得分:1)
典型的解决方案是绘制3D场景,然后切换到正交投影并使用OpenGL绘制HUD。将普通组件放置在OpenGL画布之上可能会产生不可预测的结果(它们可能会闪烁或只是不可见)。
答案 2 :(得分:0)
我遇到了同样的问题,现在我和它打了差不多一年了。我没有使用xml布局,而是在java中添加视图,如下所示:
rel.addView(camPreview, camParams);
rel.addView(glView, glParams);
rel.addView(imageView, imageParams);
我得到的一个建议是在addView调用中添加一个z索引参数,如下所示:
rel.addView(camPreview, 0, camParams);
rel.addView(glView, 1, glParams);
rel.addView(imageView, 2, imageParams);
但这也不起作用..
我甚至尝试过切换到xml布局但仍然不是我想要的
最终解决方案是:
glView.setZOrderMediaOverlay(true);
rel.addView(camPreview, camParams);
rel.addView(glView, glParams);
rel.addView(imageView, imageParams);
注意:在实际添加视图之前需要调用setZOrderMediaOverlay(true)
尝试一下,让我知道这是否适合你。