1.实现思路
通过WM.addView()方式
2.实现步骤
2.1 获取WM对象
WindowManager mWindowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
2.2 创建View
View mFloatingContentView = LayoutInflater.from(this).inflate(R.layout.float_content,null);
//查找控件
TextView txtView = mFaceDetectView.findViewById(R.id.floating_textview);
2.3 设置布局参数
//创建LayoutParams对象,WindowManager.LayoutParams为ViewGroup.LayoutParams的子类
WindowManager.LayoutParams mFloatingLayoutParams = new WindowManager.LayoutParams();
// 设置Window Type
// TYPE_SYSTEM_OVERLAY 系统顶层窗口。显示在其他一切内容之上。此窗口不能获得输入焦点,否则影响锁屏。
//mFloatingLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
// 设置悬浮框不可触摸
// mFloatingLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
//TYPE_APPLICATION_OVERLAY--所有应用之上,状态栏、输入法等系统window之下
mFloatingLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
mFloatingLayoutParams.format = PixelFormat.RGBA_8888;
// 设置悬浮框的宽高
mFloatingLayoutParams.width = 200;
mFloatingLayoutParams.height = 120;
mFloatingLayoutParams.gravity = Gravity.CENTER;
mFloatingLayoutParams.x = 0;
mFloatingLayoutParams.y = 0;
2.4 WM.addView
mWindowManager.addView(mFloatingContentView,mFloatingLayoutParams);
2.5 mainfest申请权限
<!-- 显示顶层浮窗 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2.6 高版本动态权限申请(略)
3.扩展
WindowManager.LayoutParams的type部分取值
- WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 类似低电量弹框,在应用之上
- WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY android o或之上版本推荐使用
参考资料
安卓:许可被拒绝窗式2038使用TYPE_APPLICATION_OVERLAY
网友评论