【问题标题】:Surface view z-index changing after OnResume/OnPause Android在 OnResume/OnPause Android 之后 Surface 视图 z-index 发生变化
【发布时间】:2014-03-14 13:55:39
【问题描述】:

我对 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 后面的表面视图,即使在恢复之后?

【问题讨论】:

    标签: android video view z-index


    【解决方案1】:

    首先,#setZOrderOnTop(boolean),不直接控制表面相对于彼此的 z 顺序(我不知道它是否有任何控制权。)它被记录为控制表面的 z 顺序相对于应用程序的“窗口”的表面。

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

    【讨论】:

    • 谢谢,你辛苦了 :)
    • 这有帮助。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多