【问题标题】:How to display a fullscreen TYPE_SYSTEM_ALERT window?如何显示全屏 TYPE_SYSTEM_ALERT 窗口?
【发布时间】:2011-06-16 11:59:46
【问题描述】:

我目前很难在全屏模式下显示 TYPE_SYSTEM_ALERT 窗口。我想这样做是为了在状态栏顶部有一个从服务创建的覆盖视图,但不隐藏它。

但是,将 FLAG_FULLSCREEN 标志放在我正在创建的窗口的布局参数中似乎不起作用。我找到了 STATUS_BAR 和 EXPAND_STATUS_BAR 权限,但我找不到如何使用它们。

这是 LayoutParams :

    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
            WindowManager.LayoutParams.FLAG_FULLSCREEN,
            PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.RIGHT | Gravity.TOP;

    mWindowManager.addView(mOverlayView, params);

有什么想法吗?

谢谢

【问题讨论】:

  • 我一直在使用类似的技术在任何应用程序上渲染画中画视频流。但是,使用您的方法创建的视图的更新率似乎与它下面的视图的更新率有关。你知道是否有办法解耦更新率并最大化透明覆盖的更新率?

标签: android android-layout


【解决方案1】:

我在尝试做其他事情时找到了解决方案!

为了使 TYPE_SYSTEM_ALERT 窗口位于所有其他窗口的顶部和状态栏的顶部,您必须添加 FLAG_LAYOUT_IN_SCREEN 标志而不是 FLAG_LAYOUT_FULLSCREEN 标志:

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
        PixelFormat.TRANSLUCENT);

mWindowManager.addView(mOverlayView, params);

【讨论】:

  • 状态栏还是可以拉下来的。我将 PixelFormat 更改为 OPAQUE,因此我可以看到新视图并且它确实覆盖了状态栏,但是当我从屏幕顶部向下滑动时,状态仍然会扩展并且可以点击。有什么想法吗?
  • 非常有帮助!我正在寻找一种创建模拟光标的方法,就像在 Windows Mobile 上一样,感谢您的帮助,我有了它
  • 适用于状态栏。知道如何使它也位于导航栏的顶部吗?
【解决方案2】:

它不再适用于冰淇淋三明治。状态栏覆盖TYPE_SYSTEM_ALERT 窗口。但是TYPE_SYSTEM_OVERLAY 仍然可以正常工作。

【讨论】:

  • 哦,当然这是个问题,因为 OVERLAY 不接受 MotionEvents 的方式相同,只有 WATCH_TOUCH_OUTSIDE 标志,所有事件都会有一个 ACTION_OUTSIDE 的动作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2021-12-27
相关资源
最近更新 更多