在OnResume / OnPause Android之后,表面视图z-index发生了变化

时间:2014-03-14 13:55:40

标签: android video view z-index

我对Android视图的z-index存有疑问。我有一个带有GLSurfaceView的活动和另一个用于视频播放的SurfaceView。我在互联网上看到多个表面视图没有被放置在同一个布局上,但是这些帖子有点陈旧,我不知道这是不是真的。

无论如何,我对视图的顺序有疑问。我希望VideoView能够在GLSurfaceView后面。它在应用程序启动时有效,因为我在VideoView构建时调用方法setZOrderOnTop(false)。

public class LBVideoView extends SurfaceView implements OnPreparedListener, OnCompletionListener, SurfaceHolder.Callback {

private Context m_context;

public LBVideoView(Context context) {
    super(context);
    m_context = context;

    init();
}

private void init()
{
    this.getHolder().addCallback(this);
    this.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    this.getHolder().setFormat(PixelFormat.TRANSLUCENT);
    setZOrderOnTop(false); //CODE TO SET VIDEO VIEW TO BACK
}
}

当应用程序进入后台并稍后恢复时,会出现问题。无论我在运行Android 4.1.2的设备上做什么,VideoView都会出现在前面。在运行Android 4.4的Nexus 5上,它永远不会发生。这是在最新的Android版本上改变了吗?我需要保持与旧版本的兼容性......

如果我删除所有视图并再次添加它可行,但这对我没有帮助,因为它会破坏视频的表面视图,我不希望这种情况发生。

有没有人知道如何保留GLSurfaceView背后的表面视图,即使在恢复之后?

1 个答案:

答案 0 :(得分:1)

首先,#setZOrderOnTop(boolean)并不直接控制曲面相对于彼此的z排序(我根本不知道它是否对它有任何控制权。)它已被记录控制表面相对于"窗口的z顺序"该应用程序。

glSurfaceView.setZOrderMediaOverlay(true)可能就是你想要的。这将使glSurfaceView保持在LBVideoView的顶部。 AFAIK这是控制两个表面相对于彼此的z次序的唯一方法。