优选主流主机商
任何主机均需规范使用

android悬浮窗功能的简单实现方法

Android悬浮窗是一种可以在桌面或应用界面上显示的独立窗口,常用于提醒、通知或辅助功能。本文将介绍如何使用Android系统提供的API实现悬浮窗功能。

  1. 获取悬浮窗权限

首先需要获取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. 创建悬浮窗

创建悬浮窗的方式有多种,这里简单介绍两种方式:

(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); // 悬浮窗的位置,在左上角
  1. 移动悬浮窗

可以通过手势来移动悬浮窗,具体步骤如下:

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;
    }
});
  1. 关闭悬浮窗

可以通过WindowManager或PopupWindow来关闭悬浮窗,具体步骤如下:

(1) 使用WindowManager

windowManager.removeView(imageView);

(2) 使用PopupWindow

popupWindow.dismiss();

以上就是实现Android悬浮窗功能的基本步骤。

未经允许不得转载:搬瓦工中文网 » android悬浮窗功能的简单实现方法