Android中悬浮窗口的实现原理和示例代码-程序员宅基地

技术标签: java  移动开发  

调用WindowManager,并设置WindowManager.LayoutParams的相关属性,通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了。比如创建系统顶级窗口,实现悬浮窗口效果!

WindowManager的方法很简单,基本用到的就三个addView,removeView,updateViewLayout。

而WindowManager.LayoutParams的属性就多了,非常丰富,具体请查看SDK文档。这里给出Android中的WindowManager.java源码,可以具体看一下。

下面是简单示例代码:

public class myFloatView extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button bb=new Button(getApplicationContext());
        WindowManager wm=(WindowManager)getApplicationContext().getSystemService("window");
        WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();

        /**
         *以下都是WindowManager.LayoutParams的相关属性
         * 具体用途请参考SDK文档
         */
        wmParams.type=2002;   //这里是关键,你也可以试试2003
        wmParams.format=1;
         /**
         *这里的flags也很关键
         *代码实际是wmParams.flags |= FLAG_NOT_FOCUSABLE;
         *40的由来是wmParams的默认属性(32)+ FLAG_NOT_FOCUSABLE(8)
         */
        wmParams.flags=40;
        wmParams.width=40;
        wmParams.height=40;
        wm.addView(bb, wmParams);  //创建View
    }
}
别忘了在AndroidManifest.xml中添加权限:

PS:这里举例说明一下type的值的意思:

        /**
         * Window type: phone.  These are non-application windows providing
         * user interaction with the phone (in particular incoming calls).
         * These windows are normally placed above all applications, but behind
         * the status bar.
         */
        public static final int TYPE_PHONE              = FIRST_SYSTEM_WINDOW+2;

        /**
         * Window type: system window, such as low power alert. These windows
         * are always on top of application windows.
         */
        public static final int TYPE_SYSTEM_ALERT       = FIRST_SYSTEM_WINDOW+3;
这个FIRST_SYSTEM_WINDOW的值就是2000。2003和2002的区别就在于2003类型的View比2002类型的还要top,能显示在系统下拉状态栏之上!

————————————————————————————-

已经给出可自由移动悬浮窗口的Demo,参加这里。
复制代码

本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4912232.html,如需转载请自行联系原作者


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33828101/article/details/90102137

智能推荐

Mysql断流_彻底解决ROS网页断流问题-程序员宅基地

文章浏览阅读210次。首先,检查你的ROS,确定他本身没有任何问题。然后,打开你的WINBOX登陆进去,打开防火墙规则,IP-FIREWALL-CONNECTIONS-TRACKING好了。打开TRACKING后,将里面的时间设置稍微大点。具体多大,没有确切数字,不过一定要大。最少也得30秒以上。你按照里面的默认,成倍数增加,慢慢试。下面是我自己的设置。已经没有问题了,具体什么原因,慢慢去体会。这个设置不是固定的。因为..._ros wan口断流

To display the conditions report re-run your application with 'debug' enabled.问题解决方案-程序员宅基地

文章浏览阅读8.2w次,点赞17次,收藏77次。问题描述:Error starting ApplicationContext. To display the conditions report re-run your application with ‘debug’ enabled.或者:The Tomcat connector configured to listen on port 7001 failed to start. The po..._to display the conditions report re-run your application with 'debug' enable

数字经济新生态,中小企业如何发展营销数字化-程序员宅基地

文章浏览阅读233次。在新经济发展态势下,#中小企业数字化转型#是大势所趋!

python 结束进程 terminate_【Python】multiprocessing.Process.terminate()结束子进程将导致子进程无法执行finally块,如何解决?...-程序员宅基地

文章浏览阅读2.2k次。我在使用multiprocessing库创建进程的时候,发现了这么一个问题:https://docs.python.org/3.5/library/multiprocessing.html#multiprocessing.Process中对于terminate函数的文档中说:Note that exit handlers and finally clauses, etc., will not be..._process.terminate()

TypeScript中的泛型-程序员宅基地

文章浏览阅读180次。在ts中,泛型允许在定义函数、接口类和类型别名时,不预先指定具体类型,而是在使用时指定。以达到增加代码复用性和代码安全性的目的。下面举几个例子。

唯快不破:TCP/IP详解--数据链路层 & 以太网帧格式_trdp数据链路层帧格式-程序员宅基地

文章浏览阅读246次。链路层上最常见的封装就是以太网和IEEE 802封装,这里就使用以太网作为讲解的对象。一、概述 数据链路层属于计算机网络的底层,使用的信道主要有点对点信道和广播信道两种类型。 在TCP/IP协议族中,数据链路层主要有三个目的: 1)为IP模块发送和接收数据 2)为ARP模块发送ARP请求和接收ARP应答 _trdp数据链路层帧格式

随便推点

基于52单片机的I2C和OLED的使用_stc52 点亮oled-程序员宅基地

文章浏览阅读506次。基于52单片机的I2C和OLED的使用_stc52 点亮oled

Sqrt(x)_若有代数式 2.jpg ,则不正确的c语言表达式是( )。 (3分) a/b/ce3 3ae/-程序员宅基地

文章浏览阅读117次。题目描述Implement int sqrt(int x).Compute and return the square root of x.x is guaranteed to be a non-negative integer.解题思路有一个避免溢出的方法 避免溢出的小技巧,就是把mid*mid == x写成mid == x/mid。对于一个非负整数,它的平方根不会超_若有代数式 2.jpg ,则不正确的c语言表达式是( )。 (3分) a/b/ce3 3ae/b/c 3ae/b*c ae/c/b3

嵌入式Linux工程师的成长经历_嵌入式软件工程师liu-程序员宅基地

文章浏览阅读4.2k次,点赞8次,收藏26次。从嵌入式研发行业十年,认为学习就是要不断的吸纳知识,在研发过程中,经常会遇到一些问题,这种发现问题并解决问题的过程就是进步。下面是嵌入式Linux开发工程师的成长过程,希望对大家能有所启发。 1、Linux开发工程师 首先成长为一名Linux开发工程师,这是最基本的目标,他应该具备如下的素质: (1)了解Linux基本概念和基本操作(历史,文化,起源)(命令行,配置,操作,..._嵌入式软件工程师liu

【Jenkins】部署vue项目(多种方式部署)_jenkins部署vue项目-程序员宅基地

文章浏览阅读5.0k次,点赞3次,收藏13次。第一种 (npm run build)打包的形式第二种 (npm run test)直接启动的形式第三种 使用docker镜像打包脚本_jenkins部署vue项目

从数据库 Oracle、MySql、Sql Server分别查出(TOP)100条数据_oracle top 100-程序员宅基地

文章浏览阅读1.4k次,点赞11次,收藏10次。从数据库 Oracle、MySql、Sql Server分别查出100条数据_oracle top 100

vi简介-程序员宅基地

文章浏览阅读531次。vi_vi简介