Android 悬浮窗

Android 悬浮窗

利用WindowManager可以显示类似悬浮窗效果。

1、Window和WindowManager

Window有三种类型
  • 应用Window,对应Activity
  • 子Window,对应Dialog和PopupWindow
  • 系统Window,对应Toast
WindowManager继承ViewManager,主要实现下面三个方法
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

猜你喜欢

转载自blog.csdn.net/chennai1101/article/details/79760032