Android:系统覆盖

VKD*_*Dev 8 java android android-layout

如何覆盖屏幕?

  1. 它应该是可触摸的
  2. 视图必须覆盖系统操作栏
  3. 视图必须覆盖软按钮返回/ home/recent_apps
  4. Android 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);
    }
    ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

和布局参数创建者

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);
}
Run Code Online (Sandbox Code Playgroud)

好的,看起来不错.

标志TYPE_SYSTEM_ALERT 覆盖系统栏(android <5.0),覆盖软按钮,但我可以处理onTouch事件

标志TYPE_SYSTEM_OVERLAY 覆盖系统栏,而不是覆盖按钮,我无法处理onTouch事件.

有任何想法吗?

Ash*_*nki 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);
}
Run Code Online (Sandbox Code Playgroud)

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

对于屏幕覆盖权限,我参考这篇文章如何默认启用屏幕覆盖权限