WindowManager的学习

Android的窗口机制是基于一个叫做WindowManager,这个接口可以添加view到屏幕,也可以从屏幕删除view。

它面向的对象一端是屏幕一端是view,直接忽略Activtiy, Dialog, Toast之类的。

实际上Activity, Dialog等底层的实现也是通过WindowManager的。

WindowManager的方法:addView, removeView, updateViewLayout


代码示例:

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。2003和2002的区别就在于2003类型的View比2002类型的还要top,能显示在系统下拉状态栏之上!  
        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" />

WindowManager.LayoutParams 是 WindowManager 接口的嵌套类;继承于 ViewGroup.LayoutParams 。
它的内容十分丰富。其实WindowManager.java的主要内容就是由这个类定义构成。下面来分析一下这个类:
定义
public static class WindowManager.LayoutParams extends ViewGroup.LayoutParams implements Parcelable

继承关系
java.lang.Object
↳android.view.ViewGroup.LayoutParams
↳android.view.WindowManager.LayoutParams

继承来的属性与常量
从 ViewManager.LayoutParams 继承来的属性:
android:layout_height
Specifies the basic height of the view.

android:layout_width
Specifies the basic width of the view.

从 ViewManager.LayoutParams继承的常量:
FILL_PARENT
WRAP_CONTENT
MATCH_PARENT
两个变量:
width
height



WindowManager.LayoutParams的属性就多了,非常丰富,具体请查看SDK文档。(下面只是一点点属性)

当屏幕锁定时,窗口可以被看到。这使得应用程序窗口优先于锁屏界面。可配合FLAG_KEEP_SCREEN_ON选项点亮屏幕并直接显示在锁屏界面之前。可使用FLAG_DISMISS_KEYGUARD选项直接解除非加锁的锁屏状态。此选项只用于最顶层的全屏幕窗口。
public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;

请求系统墙纸显示在你的窗口后面。窗口必须是半透明的。
public static final int FLAG_SHOW_WALLPAPER = 0x00100000;

窗口一旦显示出来,系统将点亮屏幕,正如用户唤醒设备那样。
public static final int FLAG_TURN_SCREEN_ON = 0x00200000;

解除锁屏。只有锁屏界面不是加密的才能解锁。如果锁屏界面是加密的,那么用户解锁之后才能看到此窗口,除非设置了FLAG_SHOW_WHEN_LOCKED选项。
public static final int FLAG_DISMISS_KEYGUARD = 0x00400000;

锁屏界面淡出时,继续运行它的动画。
public static final int FLAG_KEEP_SURFACE_WHILE_ANIMATING =0x10000000;

以原始尺寸显示窗口。用于在兼容模式下运行程序。
public static final int FLAG_COMPATIBLE_WINDOW = 0x20000000;

用于系统对话框。设置此选项的窗口将无条件获得焦点。
public static final int FLAG_SYSTEM_ERROR = 0x40000000;



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值