创建悬浮窗服务这不细说了,这里直接上关键代码:
WindowManager windowManager = ((WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE));
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.x = 0;
params.y = 0;
Display display = windowManager.getDefaultDisplay();
Point p = new Point();
display.getRealSize(p);
params.width = p.x;
params.height = p.y;
params.format = PixelFormat.TRANSLUCENT;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
params.type = WindowManager.LayoutParams.TYPE_PHONE;
}
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
params.gravity = Gravity.LEFT | Gravity.TOP;
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setBackgroundColor(Color.argb(120, 0, 0, 0));
windowManager.addView(linearLayout, params);
注意:
- 默认的坐标不是屏幕左上角,所以必须给x,y初始化为0
- FLAG_NOT_FOCUSABLE 和 FLAG_NOT_TOUCHABLE必须同时具有
- FLAG_LAYOUT_NO_LIMITS 和 FLAG_LAYOUT_IN_SCREEN必须同时具有,如果两者缺少FLAG_LAYOUT_NO_LIMITS,则不会包含状态栏和底部导航栏,如果缺少FLAG_LAYOUT_IN_SCREEN则不会包含状态栏
Reference
引用:
https://developer.android.google.cn/guide/topics/sensors/sensors_environment
https://blog.csdn.net/wangjicong_215/article/details/72629126
https://blog.csdn.net/qq_26819733/article/details/52210008