【Android -- 开源库】推荐一个全局悬浮窗的框架(FloatWindow)

在这里插入图片描述

需求

在日常开发中,我们可能需要实现全局悬浮窗的需求:

  • 点击悬浮窗图标可以跳转到一个固定的 Activity A;
  • 用户在 app 内的任一 Activity 里都能看到悬浮窗(除了 Activity A)
  • 悬浮窗可以关闭,可以拖动,拖动过程中松手可以自动吸附到屏幕边缘。

FloatWindow 特性

  1. 支持拖动,提供自动贴边等动画

  2. 内部自动进行权限申请操作

  3. 可自由指定要显示悬浮窗的界面

  4. 应用退到后台时,悬浮窗会自动隐藏

  5. 除小米外,4.4~7.0 无需权限申请

  6. 位置及宽高可设置百分比值,轻松适配各分辨率

  7. 支持权限申请结果、位置等状态监听

  8. 链式调用,简洁清爽

使用

1. 声明权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

2. 添加依赖

  • 在工程的 build.gradle 中添加:
	allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}
  • 在应用的 build.gradle 中添加:
	dependencies {
	        implementation 'com.github.yhaolpz:FloatWindow:1.0.9'
	}

3. 基础使用

        FloatWindow
              .with(getApplicationContext())
              .setView(view)
              .setWidth(100)                               //设置控件宽高
              .setHeight(Screen.width,0.2f)
              .setX(100)                                   //设置控件初始位置
              .setY(Screen.height,0.3f)
              .setDesktopShow(true)                        //桌面显示
              .setViewStateListener(mViewStateListener)    //监听悬浮控件状态改变
              .setPermissionListener(mPermissionListener)  //监听权限申请结果
              .build();

宽高及位置可设像素值或屏幕宽/高百分比,默认宽高为 wrap_content;默认位置为屏幕左上角,x、y 为偏移量。

4. 指定界面显示

			.setFilter(true, A_Activity.class, C_Activity.class)

此方法表示 A_Activity、C_Activity 显示悬浮窗,其他界面隐藏。

			.setFilter(false, B_Activity.class)

此方法表示 B_Activity 隐藏悬浮窗,其他界面显示。

注意:setFilter 方法参数可以识别该 Activity 的子类

5. 可拖动悬浮窗及回弹动画

			.setMoveType(MoveType.slide)
            .setMoveStyle(500, new AccelerateInterpolator())  //贴边动画时长为500ms,加速插值器

共提供 4 种 MoveType :

  • MoveType.slide : 可拖动,释放后自动贴边 (默认)

  • MoveType.back : 可拖动,释放后自动回到原位置

  • MoveType.active : 可拖动

  • MoveType.inactive : 不可拖动

6. 后续操作

        //手动控制
        FloatWindow.get().show();
        FloatWindow.get().hide();

        //修改显示位置
        FloatWindow.get().updateX(100);
        FloatWindow.get().updateY(100);

        //销毁
        FloatWindow.destroy();

实例

1. 逻辑代码

public class MyAPP extends Application {


    private static final String TAG = "FloatWindow";

    @Override
    public void onCreate() {
        super.onCreate();

        ImageView imageView = new ImageView(getApplicationContext());
        imageView.setImageResource(R.drawable.icon);

        FloatWindow
                .with(getApplicationContext())
                .setView(imageView)
                .setWidth(Screen.width, 0.2f) //设置悬浮控件宽高
                .setHeight(Screen.width, 0.2f)
                .setX(Screen.width, 0.8f)
                .setY(Screen.height, 0.3f)
                .setMoveType(MoveType.slide,100,-100)
                .setMoveStyle(500, new BounceInterpolator())
                .setFilter(true, A_Activity.class, C_Activity.class)
                .setViewStateListener(mViewStateListener)
                .setPermissionListener(mPermissionListener)
                .setDesktopShow(true)
                .build();


        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(BaseApplication.this, "onClick", Toast.LENGTH_SHORT).show();
            }
        });
    }

    private PermissionListener mPermissionListener = new PermissionListener() {
        @Override
        public void onSuccess() {
            Log.d(TAG, "onSuccess");
        }

        @Override
        public void onFail() {
            Log.d(TAG, "onFail");
        }
    };

    private ViewStateListener mViewStateListener = new ViewStateListener() {
        @Override
        public void onPositionUpdate(int x, int y) {
            Log.d(TAG, "onPositionUpdate: x=" + x + " y=" + y);
        }

        @Override
        public void onShow() {
            Log.d(TAG, "onShow");
        }

        @Override
        public void onHide() {
            Log.d(TAG, "onHide");
        }

        @Override
        public void onDismiss() {
            Log.d(TAG, "onDismiss");
        }

        @Override
        public void onMoveAnimStart() {
            Log.d(TAG, "onMoveAnimStart");
        }

        @Override
        public void onMoveAnimEnd() {
            Log.d(TAG, "onMoveAnimEnd");
        }

        @Override
        public void onBackToDesktop() {
            Log.d(TAG, "onBackToDesktop");
        }
    };
}

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin-Dev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值