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

这篇具有很好参考价值的文章主要介绍了【Android -- 开源库】推荐一个全局悬浮窗的框架(FloatWindow)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

android全局悬浮窗,Android -- 开源库,android,开源,悬浮窗

需求

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

  • 点击悬浮窗图标可以跳转到一个固定的 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 : 不可拖动文章来源地址https://www.toymoban.com/news/detail-616882.html

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");
        }
    };
}

到了这里,关于【Android -- 开源库】推荐一个全局悬浮窗的框架(FloatWindow)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 推荐一个开源的区块链开发者工具网站

    开源区块链开发者工具箱 https://ChainTool.tech 今天可以正式上线了。ChainTool 使用完全开源的方式编写一些开发者日常经常使用的工具。 大约在两个月前, ChainToolDAO 成立了,成立 ChainToolDAO 的来由是这样的:我是一名区块链开发者,经常要遇到一些琐碎的工作, 例如:临时创建

    2024年02月10日
    浏览(47)
  • 推荐一个.Net分布式微服务开发框架

    在给大家介绍之前,我们一起来看看分布式架构的使用场景与好处。 针对一些互联网系统,大数据、高并发和快速响应,都是系统必须满足的 ,而单机系统的架构是无法满足这样的需求的,这时候我们就需要用到分布式的架构。 分布式架构具备以下的好处: 高性能 :把高

    2024年02月10日
    浏览(43)
  • < 开源项目框架:推荐几个开箱即用的开源管理系统 - 让开发不再复杂 >

    SCUI 是一个中后台前端解决方案,基于 Vue3 和 elementPlus 实现。使用最新的前端技术栈,提供各类实用的组件方便在业务开发时的调用,并且持续性的提供丰富的业务模板帮助你快速搭建企业级中后台前端任务。 项目地址:https://gitee.com/lolicode/scui 框架内置了大量的通用组件可

    2024年02月04日
    浏览(50)
  • 推荐一个.Ner Core开发的配置中心开源项目

    当你把单体应用改造为微服务架构,相应的配置文件,也会被分割,被分散到各个节点。这个时候就会产生一个问题,配置信息是分散的、冗余的,变成不好维护管理。这个时候我们就需要把配置信息独立出来,成立一个配置中心。 这是一个基于.Net Core开发的,轻量级配置中

    2024年02月04日
    浏览(54)
  • 使用uniapp实现全局悬浮按钮(可拖动)

    效果如下 实现方案 使用uniapp官方组件 movable-area和movable-view 代码解析 在components新建一个xxx.vue组件 重点在于movable-area与movable-view需要分别增加pointer-events: none和pointer-events: auto用于组件事件穿透与恢复组件事件(此处不加会导致引用该组件的父组件无法使用事件) 组件代码

    2024年02月11日
    浏览(50)
  • 推荐一个.Net Core开发的Websocket群聊、私聊的开源项目

    今天给大家推荐一个使用Websocket协议实现的、高性能即时聊天组件,可用于群聊、好友聊天、游戏直播等场景。 这是一个基于.Net Core开发的、简单、高性能的通讯组件,支持点对点发送、群聊、在线状态的订阅。 该项目还包含群聊例子,可以用于学习。 1、跨平台:基于.N

    2024年02月03日
    浏览(58)
  • 推荐一个日历转换开源工具库,支持C#、Java、PHP等主流的语言

    日历对我们来说,最熟悉的就是阳历和农历,在中国每年都有固定的节日、节气、中国特有传统节日,有些节日是固定的,但是节气这些都需要我们经过一定规则换算出来。 所以,今天给大家推荐一个开源库,它支持阳历、阴历、佛历和道历的日历转换,可以满足我们的所有

    2024年02月06日
    浏览(73)
  • LightFM:一款开源推荐系统框架,可以轻松实现大规模矩阵分解,快速、高效地处理大型矩阵

    作者:禅与计算机程序设计艺术 LightFM 是由 Yelp 开发的一款开源推荐系统框架,可以轻松实现大规模矩阵分解。该项目基于 TensorFlow 和 Keras 框架,可以快速、高效地处理大型矩阵。它具有以下特点: 提供了一种简单的方法来训练矩阵分解模型,即通过定义项间的交互矩阵和用

    2024年02月10日
    浏览(49)
  • 保护你无价的数据 | 推荐一个开源备份工具,可去重、增量、压缩、还原到特定日期...

    Borg 的优势是 高效: BorgBackup 会将文件按数据块去重,只有改动的数据块才会被备份。 一个 25 GiB 的虚拟机磁盘文件,只改动了 1 GiB,那就只会新增备份这 1 GiB 的数据; 高速: 核心算法使用 C 编译,使用缓存快速跳过未改动过的文件以加快备份速度; 加密: 数据默认是

    2024年02月05日
    浏览(52)
  • 各种Android ui 开源框架

    MaterialDesignExample - 本APP用来演示Material Design控件的使用。 https://www.aswifter.com/2015/07/02/Material-Design-Example-5/ , 使用说明。 InstaMaterial - InstalMaterial 项目(非常多的UI样式:ViewAnimator、RecyclerView、拍照), InstalMaterial学习笔记之Reveal效果。 NavigationDrawer-MaterialDesign - 一个Materia

    2024年04月28日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包