Android中悬浮窗口的实现原理实例分析
程序员文章站
2023-11-12 10:00:28
本文实例讲述了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程序设计有所帮助。