EnFloatingView

Introduction: 应用内悬浮窗,无需一切权限,适配所有 ROM 和厂商,no permission floating view.
More: Author   ReportBugs   OfficialWebsite   
Tags:

Logo

Jcenter Muxuan Website

《移动开发架构设计实战》

🔥🔥🔥 马上重构你的架构思维

==========================

English

无需一切权限,不受各种国产 ROM 限制,默认可以显示的应用内悬浮窗。

传统方案

对于传统悬浮窗和一些古老的“黑科技”悬浮窗的实现,想必已经有很多成熟的案例了,实现策略基本为以下两种:

  1. TYPE_SYSTEM_ALERT 类型
mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams()
layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

​ 需要权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" ></uses>
  1. TYPE_TOAST / TYPE_PHONE 类型

​ 7.1.1 以下不需要权限声明,在魅族、华为、小米等机型上默认隐藏,需要引导用户打开悬浮窗。

传统方案的问题

第一种方案因为存在各种限制,不能被众多开发采纳,故而比较流行的悬浮窗实现方式是第二种。

但是,我们有自己的原则:

  • 不能接受 7.1.1 以上机型,使用第二种方式实现悬浮窗仍需要用户主动授予权限的操作?
  • 不能接受在魅族、华为、小米等机型上默认隐藏,需要引导用户打开悬浮窗,就像这样

权限管理

功能

  • 应用内显示,无需申请任何权限
  • 应用内显示,所有机型都可以默认显示悬浮窗,无需引导用户做更多设置
  • 支持拖拽
  • 超出屏幕限制移动
  • 可自动吸附到屏幕边缘

基本使用规则

1.在 gralde 的 dependencies 中加入

       compile 'com.imuxuan:floatingview:1.6'

2.在基类 Activity(注意必须是基类 Activity)中的 onStart 和 onStop(或者安卓原生 ActivityLifeCycle 监听)中添加如下代码

       @Override
       protected void onStart() {
           super.onStart();
           FloatingView.get().attach(this);
       }

       @Override
       protected void onStop() {
           super.onStop();
           FloatingView.get().detach(this);
       }

3.展示悬浮窗

       FloatingView.get().add();

扩展用法

1.销毁悬浮窗

       FloatingView.get().remove();

2.添加点击事件

       FloatingView.get().listener(new MagnetViewListener() {
            @Override
            public void onRemove(FloatingMagnetView magnetView) {
                Toast.makeText(TestActivity.this, "我没了", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onClick(FloatingMagnetView magnetView) {
                Toast.makeText(TestActivity.this, "点到我了", Toast.LENGTH_SHORT).show();
            }
        });

3.获得悬浮窗 View

       FloatingView.get().getView();

4.设置悬浮窗 icon

       FloatingView.get().icon(R.drawable.XXXXX);

5.设置悬浮窗 View

       FloatingView.get().customView(new View());
       or
       FloatingView.get().customView(R.layout.XXXXX);

6.设置悬浮窗位置等布局参数

       FloatingView.get().layoutParams(new ViewGroup.LayoutParams());

效果图

预览图

更新记录

1.6

修复横竖屏切换错位 & 添加到布局时偶发崩溃

1.5

修复内存泄露问题

1.4

适配折叠屏

1.3

增加自定义 layout 等 API

1.2

修复拖拽失效

1.1

点击监听问题处理

1.0

创建项目

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools