欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中悬浮窗口的实现原理实例分析

程序员文章站 2023-12-03 14:20:04
本文实例讲述了android中悬浮窗口的实现原理。分享给大家供大家参考。具体如下: 用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,...

本文实例讲述了android中悬浮窗口的实现原理。分享给大家供大家参考。具体如下:

用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍全球网络没有一篇像样的资料,现在将实现原理简单叙述如下:

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

希望本文所述对大家的android程序设计有所帮助。