Android悬浮窗是一种可以在桌面或应用界面上显示的独立窗口,常用于提醒、通知或辅助功能。本文将介绍如何使用Android系统提供的API实现悬浮窗功能。
- 获取悬浮窗权限
首先需要获取SYSTEM_ALERT_WINDOW权限,因为这个权限属于系统级别的权限,所以需要在AndroidManifest.xml中进行声明:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
同时,在应用运行时也需要向用户请求授权:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(context)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);
}
- 创建悬浮窗
创建悬浮窗的方式有多种,这里简单介绍两种方式:
(1) 使用WindowManager
可以通过WindowManager来创建一个悬浮窗,具体步骤如下:
// 创建一个layoutParams对象,指定悬浮窗的属性
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; // 悬浮窗类型
layoutParams.format = PixelFormat.TRANSLUCENT;
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; // 焦点设置为不可获得
layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
layoutParams.gravity = Gravity.START | Gravity.TOP; // 悬浮窗的位置,在左上角
layoutParams.x = 0;
layoutParams.y = 0;
// 创建一个ImageView对象,作为悬浮窗的内容
ImageView imageView = new ImageView(context);
imageView.setImageResource(R.drawable.ic_launcher);
// 获取WindowManager对象,并将ImageView添加到WindowManager中
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
windowManager.addView(imageView, layoutParams);
(2) 使用PopupWindow
通过PopupWindow也可以创建一个悬浮窗,具体步骤如下:
// 创建一个PopupWindow对象,并设置其属性
PopupWindow popupWindow = new PopupWindow(context);
popupWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
popupWindow.setFocusable(false); // 焦点设置为不可获得
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); // 设置背景透明
// 创建一个ImageView对象,作为悬浮窗的内容
ImageView imageView = new ImageView(context);
imageView.setImageResource(R.drawable.ic_launcher);
// 将ImageView添加到PopupWindow中,并显示PopupWindow
popupWindow.setContentView(imageView);
popupWindow.showAtLocation(view, Gravity.START | Gravity.TOP, 0, 0); // 悬浮窗的位置,在左上角
- 移动悬浮窗
可以通过手势来移动悬浮窗,具体步骤如下:
imageView.setOnTouchListener(new View.OnTouchListener() {
private int lastX, lastY;
private int paramX, paramY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
paramX = layoutParams.x;
paramY = layoutParams.y;
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
layoutParams.x = paramX + dx;
layoutParams.y = paramY + dy;
windowManager.updateViewLayout(imageView, layoutParams);
break;
}
return true;
}
});
- 关闭悬浮窗
可以通过WindowManager或PopupWindow来关闭悬浮窗,具体步骤如下:
(1) 使用WindowManager
windowManager.removeView(imageView);
(2) 使用PopupWindow
popupWindow.dismiss();
以上就是实现Android悬浮窗功能的基本步骤。