Giter Site home page Giter Site logo

floatwindow's Introduction

FloatWindow 安卓任意界面悬浮窗

悬浮按钮图

特性:

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

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

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

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

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

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

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

8.链式调用,简洁清爽

集成:

第 1 步、在工程的 build.gradle 中添加:

	allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}

第 2 步、在应用的 build.gradle 中添加:

	dependencies {
	        compile 'com.github.yhaolpz:FloatWindow:1.0.9'
	}

使用:

0.声明权限

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

1.基础使用

        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 为偏移量。

2.指定界面显示

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

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

              .setFilter(false, B_Activity.class)

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

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

也就是说,如果 A_Activity、C_Activity 继承自 BaseActivity,你可以这样设置:

              .setFilter(true, BaseActivity.class)

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

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

共提供 4 种 MoveType :

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

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

MoveType.active : 可拖动

MoveType.inactive : 不可拖动

setMoveStyle 方法可设置动画效果,只在 MoveType.slide 或 MoveType.back 模式下设置此项才有意义。默认减速插值器,默认动画时长为 300ms。

4.后续操作

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

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

        //销毁
        FloatWindow.destroy();

以上操作应待悬浮窗初始化后进行。

5.多个悬浮窗

        FloatWindow
                .with(getApplicationContext())
                .setView(imageView)
                .build();

        FloatWindow
                .with(getApplicationContext())
                .setView(button)
                .setTag("new")
                .build();


        FloatWindow.get("new").show();
        FloatWindow.get("new").hide();
        FloatWindow.destroy("new");

创建第一个悬浮窗不需加 tag,之后再创建就需指定唯一 tag ,以此区分,方便进行后续操作。

举个栗子

点击查看 : 示例代码

最后:

悬浮按钮图

本人已尽量去兼容更多机型,但经济有限,如果你想帮助此库,提 Issues 标出当前版本不适配的机型即可,感谢~

更新日志

v1.0.9

修复拖动点击事件冲突

添加权限结果监听、位置等状态监听

支持贴边边距设置

v1.0.8

适配 4.4~8.0 及各大国产机型

支持桌面显示

v1.0.7

适配 Android 8.0

v1.0.6

支持悬浮窗拖动及相关动效

位置及宽高可设置百分比值

更改相关类名及使用方法

v1.0.5

修复未调用show显示悬浮窗bug

v1.0.4

返回桌面将会自动隐藏控件,无需再监听应用退到后台等操作

新增 Activity 过滤器,可自由指定哪些界面显示,哪些界面不显示

FixedFloatWindow 类改为 FFWindow

v1.0.3

修复已知 bug

新增 dismiss 方法

新增其他方案,如:所有版本都申请权限

floatwindow's People

Contributors

0wei avatar xuyingke avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

floatwindow's Issues

可否添加一个位置监听

自己添加setOnTouchListener()的话会覆盖手势响应

var con = layoutInflater.inflate(R.layout.view_alert, null)

    var alert = FloatWindow
            .with(getApplicationContext())
            .setView(con)
            .setDesktopShow(true)
            .build()

    con.setOnTouchListener { con, event ->
        Log.d("ceshi", event.x.toString())
        false
    }

悬浮窗没有紧密跟随手指的位置

我发现手指滑动的时候,悬浮窗没有紧密跟随手指的位置,导致滑动幅度大和时间久了之后,最后手指停留的位置和悬浮窗显示的位置距离可以越来越大

小米权限如何重新获取

第一次获取权限时用户未授权悬浮窗权限,第二次进入页面如何重新获取权限。

@Override
public void show() {
    if (once) {
        mFloatView.init();
        once = false;
        isShow = true;
    } else {
        if (isShow) return;
        getView().setVisibility(View.VISIBLE);
        isShow = true;
    }
}

第一次进来时,未获取到权限,isShow = true。 第二次进页面,如何重新获取权限并初始化mFloatView

悬浮框

非常感谢提供,能否提供一个功能,可以左滑或者右滑隐藏一半并显示半透明呢,类似应用市场的效果,这个应用场景可能很多,非常感谢 qq1570231200

有个问题请教一下

机型:非miui android6.0
正常使用是没问题的,但是因为我们是虚拟导航栏(可隐藏的),且悬浮窗刚好就在底部,这样一来导航栏就被悬浮窗盖住了;有没有办法使得虚拟导航栏的层级在悬浮窗之上呢?

屏幕方向切换

在竖屏时开启悬浮按钮,切换方向后悬浮按钮的自动贴边会出错,自动贴边会贴在屏幕中间。

大概原因应该是转向后悬浮按钮的贴边坐标还是以左上角为原点,横坐标为手机宽度。但是横屏后横坐标应该是手机长度、

Android8.0报 bad token

Process: com.example.yhao.fixedfloatwindow, PID: 2179
java.lang.RuntimeException: Unable to resume activity {com.example.yhao.fixedfloatwindow/com.example.yhao.floatwindow.A_Activity}: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@da7110b -- permission denied for window type 2002
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3645)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3685)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2898)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@da7110b -- permission denied for window type 2002
at android.view.ViewRootImpl.setView(ViewRootImpl.java:789)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:92)
at com.yhao.floatwindow.FloatPhone.init(FloatPhone.java:55)
at com.yhao.floatwindow.IFloatWindowImpl.show(IFloatWindowImpl.java:70)
at com.yhao.floatwindow.IFloatWindowImpl$1.onShow(IFloatWindowImpl.java:52)
at com.yhao.floatwindow.FloatLifecycle.onActivityResumed(FloatLifecycle.java:62)
at android.app.Application.dispatchActivityResumed(Application.java:216)
at android.app.Activity.onResume(Activity.java:1312)
at android.support.v4.app.FragmentActivity.onResume(FragmentActivity.java:437)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1354)
at android.app.Activity.performResume(Activity.java:7079)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3620)

非常棒!

建议加上这几个功能:

  1. 设置悬浮球左右贴边的Margin。
  2. 加入记录悬浮球的位置,当用户重新改变了悬浮球的位置,那么下一次在新的位置出现。
    以上我都实现了,建议楼主加上去。

兼容问题

我想问下,这个是不是4.4以下就不可以用,应为我们系统 目前兼容到4.0以上

不显示悬浮窗,第二次进入应用才显示。

FloatWindow
.with(getApplicationContext())
.setView(imageView)
.setDesktopShow(true) //默认 false
.build();

在界面上到按钮点击后,执行上述代码,然后屏幕上并没有显示悬浮窗,然后我点击home按键,回到桌面,也没有显示,然后我再次进入app到时候,这时候却出现了悬浮窗。
测试环境: 一加5T Android 8.1

悬浮窗拥有权限但是不显示

library版本:compile 'com.github.yhaolpz:FloatWindow:1.0.8'

ImageView imageView = new ImageView(getApplicationContext());
        imageView.setImageResource(R.mipmap.ic_launcher_round);
        FloatWindow
                .with(getApplicationContext())
                .setView(imageView)
                .setMoveType(MoveType.active)
                .build();

在调用了上面的代码后,悬浮窗不显示。按Home键后再次回到自己的app就会显示悬浮窗。demo没有出现这样的问题,请问有人能知道大概是什么原因引起的么?

NullPointerException:Attempt to invoke interface method 'void

java.lang.RuntimeException:Unable to resume activity {com.gipex.im/com.yhao.floatwindow.FloatActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=756232212, result=0, data=null} to activity {com.gipex.im/com.yhao.floatwindow.FloatActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'void com.yhao.floatwindow.PermissionListener.onSuccess()' on a null object reference
2 android.app.ActivityThread.performResumeActivity(ActivityThread.java:3664)
3 ......
4 Caused by:
5 java.lang.NullPointerException:Attempt to invoke interface method 'void com.yhao.floatwindow.PermissionListener.onSuccess()' on a null object reference
6 com.yhao.floatwindow.FloatActivity.onActivityResult(FloatActivity.java:47)
7 android.app.Activity.dispatchActivityResult(Activity.java:7317)
8 android.app.ActivityThread.deliverResults(ActivityThread.java:4351)
9 android.app.ActivityThread.performResumeActivity(ActivityThread.java:3636)
10 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3704)
11 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2917)
12 android.app.ActivityThread.-wrap11(Unknown Source:0)
13 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1608)
14 android.os.Handler.dispatchMessage(Handler.java:105)
15 android.os.Looper.loop(Looper.java:164)
16 android.app.ActivityThread.main(ActivityThread.java:6665)
17 java.lang.reflect.Method.invoke(Native Method)
18 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
19 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781)

设备机型

小米 MI 6
系统版本

Android 8.0.0,level 26

消息情况

假设main入口的activity为A。依次有A,B,C,A跳往B、在B创建悬浮窗可以显示一会然后消失,跳到C的时候情况一样。但在A创建则一切正常

(忽略)宽高不能wrap_content

看了下代码,宽高通过setWidth setHeight 传固定的。
如果我的悬浮窗是一个textview,希望宽高可以根据textview内容自适应,能否添加支持呢

我弄的是摄像头预览悬浮

假如app是横屏的,一开始显示的位置就会不对了,而且,横屏一开始摄像头预览显示的方向还是竖屏的方向

权限申请回调

@OverRide
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 756232212) {
if (PermissionUtil.hasPermissionOnActivityResult(this)) {
mPermissionListener.onSuccess();
} else {
//这里应该是 mPermissionListener.onFail();
mPermissionListener.onSuccess();
}
}
finish();
}
代码中申请悬浮窗权限的回调错误,导致的直接问题是在申请悬浮窗权限的时候,用户选择了拒绝。应用崩溃

魅族M5s -经测试无法实现悬浮窗

魅族M5s flyme6 android6.0 经测试无法实现悬浮窗,也没有申请权限,如果从应用管理里面把悬浮窗权限打开,是可以实现悬浮窗操作的,希望能够适配,或者有申请权限也可,

显示一下就消失问题

用baseactivity 显示一下就消失了,每次activity创建的时候和resume的时候显示一下就消失
在主界面 activity 里面初始化
FloatWindow
.with(getApplicationContext())
.setView(view)
.setWidth(Screen.width,0.2f)
.setHeight(Screen.width,0.2f)
.setX(Screen.width,0.7f)
.setY(Screen.height,0.2f)
.setMoveType(MoveType.back)
.setMoveStyle(300,null)
.setFilter(true,MainActivity.class)
.build();
FloatWindow.get().show();

bug

在模拟器上,7.1会直接崩溃,真机不知道会怎么样?

可否增加手动控制权限申请

需求:打开app时,弹出dialog询问用户需要获取弹窗权限,确认后再初始化Floatwindow。
问题:dialog确认按钮后,进行初始化Floatwindow,发现没有跳转到权限申请页面,关掉app再开启或者跳转下一个页面的时候才触发权限申请页面。不加判断直接初始化是没问题的

初始化显示问题

大哥,在Application初始化打开应用就可以显示,换到在MainActivity里面初始化就只能退出一次第二次进入才能显示出来,这是咋回事?

有没有事件回调?

光有一个显示的但没有点击事件产生好像感觉有点没多大用处,可否设置点击事件监听?

oppo R9s 6.0.1 适配完毕

主要修复oppo不能全局展示悬浮窗的问题。
修复代码:
FloatPhone 的方法 init中
判断MIUI出增加OPPO判断即可:

...
 } else if (Miui.rom() || DeviceType.isOppo()) {
...

oppo判断方法如下:

查询build.prop是否有ro.build.version.opporom属性

申请加入维护组

小米手机能够直接申请权限吗

你好:
博主:对于申请权限这块,小米手机就是个奇葩,需要用户手动去申请,但是其用户体验不好,有没能只能跳过申请权限的呢,特别是对于小米手机!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.