当前位置: 首页 > news >正文

Android中悬浮窗口的实现


转贴自http://blog.163.com/dangzhengtao@yeah/blog/static/77800874201111111323420/



调用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中添加权限:

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

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,能显示在系统下拉状态栏之上!

相关文章:

  • 面向对象-类-成员变量-局部变量-this
  • 全字匹配替换函数
  • Codeforces Round #342 (Div. 2)
  • LeetCode-Maximum Subarray[dp]
  • vue2.0引入腾讯地图
  • SQLServer中的N是什么意思?
  • 一起来看看IOS内存泄漏的一个问题
  • 是真佛只道家常,读《麦肯锡工具》——leo鉴书(15)
  • Android中用Google Map API出现的getLastKnowLocation空指针异常
  • Java中lock锁的问题
  • vuex
  • fopen /open,read/write和fread/fwrite区别
  • 剑指offer(1):数组
  • 基于iTop4412的FM收音机系统设计(一)
  • 信者的路,读《病隙碎笔》——leo鉴书(16)
  • ES6指北【2】—— 箭头函数
  • [NodeJS] 关于Buffer
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • avalon2.2的VM生成过程
  • Babel配置的不完全指南
  • ES6 ...操作符
  • EventListener原理
  • Hibernate最全面试题
  • javascript数组去重/查找/插入/删除
  • JS函数式编程 数组部分风格 ES6版
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • js中forEach回调同异步问题
  • PhantomJS 安装
  • PHP 小技巧
  • python docx文档转html页面
  • SpingCloudBus整合RabbitMQ
  • ubuntu 下nginx安装 并支持https协议
  • XML已死 ?
  • 半理解系列--Promise的进化史
  • 服务器从安装到部署全过程(二)
  • 回顾 Swift 多平台移植进度 #2
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 如何实现 font-size 的响应式
  • 我与Jetbrains的这些年
  • 详解NodeJs流之一
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ​2021半年盘点,不想你错过的重磅新书
  • ​批处理文件中的errorlevel用法
  • ###C语言程序设计-----C语言学习(3)#
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (4) PIVOT 和 UPIVOT 的使用
  • (day 12)JavaScript学习笔记(数组3)
  • (四)Controller接口控制器详解(三)
  • (转)scrum常见工具列表
  • (转)shell调试方法
  • (转)VC++中ondraw在什么时候调用的
  • .NET : 在VS2008中计算代码度量值
  • .net core 依赖注入的基本用发