我在FrameLayout中有两个GLSurfaceViews,如下所示:
<FrameLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent" >
<android.opengl.GLSurfaceView
android:id = "@+id/glSurfaceView1"
android:layout_width = "match_parent"
android:layout_height = "match_parent" >
<android.opengl.GLSurfaceView
android:id = "@+id/glSurfaceView2"
android:layout_width = "match_parent"
android:layout_height = "match_parent" >
</FrameLayout>
使用布局时,在glSurfaceView1 之前绘制 glSurfaceView2。即你在屏幕上看到的只是glSurfaceView1。这个问题在这里部分回答: Android: FrameLayout not respecting draw order
我已经尝试将GLSurfaceViews动态添加到FrameLayout,但这仍然没有按正确的顺序绘制。用RelativeLayout替换FrameLayout也不起作用。
那么,我如何强制绘制顺序,以便在glSurfaceView2之前绘制 glSurfaceView1 (就像它应该的那样)?
答案 0 :(得分:0)
您无法从布局强制执行此操作,因为SurfaceView曲面不是由应用程序组成的。这些图层被传递给系统合成器,系统合成器看到两层试图同时占据同一个空间,并选择一个胜利者。
您可以从一个小集合中为SurfaceView选择Z顺序。默认情况下,Surface位于View图层后面的后面。您可以使用setZOrderMediaOverlay()
将其放在View和最后面的Surface之间,或setZOrderOnTop()
将它放在所有内容之前。这些调用必须在创建Surface之前进行,通常在活动类的onCreate()
中,在surfaceCreated()
回调触发之前。
(注意:GLSurfaceView只是一个带有一些辅助代码的SurfaceView,用于配置EGL和管理线程.AFAIK它不会干扰Z顺序选择。)
您可以在Grafika的“multi-surface test”中找到一个包含三个重叠SurfaceView的示例。