【问题标题】:Android: system overlayAndroid:系统覆盖
【发布时间】:2015-04-30 00:20:29
【问题描述】:

如何叠加屏幕?

  1. 它应该是可触摸的
  2. 视图必须覆盖系统操作栏
  3. 视图必须覆盖软按钮 back/home/recent_apps
  4. 安卓4.0+

    public class MyService extends Service {
    
    @Override
    public void onCreate() {
        super.onCreate();
        WindowManager.LayoutParams params = ViewUtils.generateFullScreenParams(true);
    
        final WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.addView(overlayView, params);
    }
    ...
    }
    

和布局参数创建者

public static WindowManager.LayoutParams generateFullScreenParams() {
    return new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,

            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,

            PixelFormat.TRANSLUCENT);
}

好的,看起来不错。

标记TYPE_SYSTEM_ALERT 覆盖系统栏(android 不覆盖软按钮,但我可以处理onTouch事件

标记 TYPE_SYSTEM_OVERLAY 覆盖系统栏,不覆盖按钮,我无法处理 onTouch 事件。

有什么想法吗?

【问题讨论】:

  • 为什么你的网络设置主题全屏没有标题栏?
  • 此视图来自服务,但主题实际适用于活动。如果我错了,请纠正我
  • 你在 OnCreate 里面的 Service 里面创建 View ??喜欢对话框?
  • 是的,我编辑了我的问题
  • 也许我可以在没有视图的情况下检测屏幕上的触摸事件? (适用于所有应用程序)

标签: java android android-layout


【解决方案1】:
public static WindowManager.LayoutParams generateFullScreenParams() {
    return new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,

            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,

            PixelFormat.TRANSLUCENT);
}

在此代码中您添加了WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 删除此行的作品并在查看其作品时添加触摸事件

对于屏幕覆盖权限,我指的是这个帖子How to enable screen overlay permission by default

【讨论】:

    【解决方案2】:

    您可以使用我的 library 只需删除此方法 addWatermarkWithinApplicationLifecycle() 将覆盖层与应用程序生命周期相结合(因为您想在手机应用程序中显示覆盖层)。我试图以可重用的方式执行此操作,您只需一个简单的方法调用即可隐藏和显示覆盖。也请不要忘记添加这些权限 -

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"  />
    <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
    <uses-permission android:name="android.permission.ACTION_MANAGE_OVERLAY_PERMISSION"/>
    

    我的图书馆的 gif 预览 -

    【讨论】:

      猜你喜欢
      • 2013-01-19
      • 2015-12-15
      • 2021-05-08
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      相关资源
      最近更新 更多