Android 悬浮窗
利用WindowManager可以显示类似悬浮窗效果。
1、Window和WindowManager
- 应用Window,对应Activity
- 子Window,对应Dialog和PopupWindow
- 系统Window,对应Toast
public interface ViewManager {
public void addView(View view, ViewGroup.LayoutParams params);
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
public void removeView(View view);
}
2、创建悬浮窗
悬浮窗对应于系统Window,通过WindowManager.addView加入界面WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
lp.width = ViewGroup.LayoutParams.WRAP_CONTENT;
lp.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL; // 窗口位置
lp.format = PixelFormat.TRANSPARENT; // 位图格式
lp.type = WindowManager.LayoutParams.TYPE_TOAST; // 窗口的层级关系
lp.flags= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; // 窗口的模式
wm.addView(view, lp);
创建悬浮窗需要系统权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
3、悬浮窗禁用
在Android6.0以后,悬浮窗权限默认是禁用的,需要用户确定打开,在返回时确认权限。public void askForPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) {
Toast.makeText(this, "请授权!", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_OVERLAY_PERMISSION) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.canDrawOverlays(this)) {
}
}
}
参考资料:https://blog.csdn.net/yhaolpz/article/details/68936932
参考资料:https://blog.csdn.net/core_ice/article/details/52464125