Android:在GLSurfaceViews,SurfaceViews上强制绘制顺序

时间:2015-08-04 04:25:31

标签: android surfaceview android-framelayout glsurfaceview

我在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 (就像它应该的那样)?

1 个答案:

答案 0 :(得分:0)

您无法从布局强制执行此操作,因为SurfaceView曲面不是由应用程序组成的。这些图层被传递给系统合成器,系统合成器看到两层试图同时占据同一个空间,并选择一个胜利者。

您可以从一个小集合中为SurfaceView选择Z顺序。默认情况下,Surface位于View图层后面的后面。您可以使用setZOrderMediaOverlay()将其放在View和最后面的Surface之间,或setZOrderOnTop()将它放在所有内容之前。这些调用必须在创建Surface之前进行,通常在活动类的onCreate()中,在surfaceCreated()回调触发之前。

(注意:GLSurfaceView只是一个带有一些辅助代码的SurfaceView,用于配置EGL和管理线程.AFAIK它不会干扰Z顺序选择。)

您可以在Grafika的“multi-surface test”中找到一个包含三个重叠SurfaceView的示例。