摘要
WindowManager我们又要学到的一个重要服务是系统级的服务,这个服务可将一个视图View可以是来自xml布局文件的视图放入一个布局,而且这个布局可以放在其他Activity的上方,可以进行添加,删除,更新视图.这个是一个我们陌生又熟悉的Api
一方面我们刚认识这个api 他的方法如下
windowmg.addView(view, params);//添加
windowmg.removeView(view);//移除
windowmg.updateViewLayout(view, params);//更新
另一方面又是我们很熟悉的,因为我们一直用的Activity,Toast,Dialog,PopupWindow的底层是WindowManager。这时候学员们迷惑了。怎么这么强大的类我们怎么不先掌握呢?我们只要掌握一个类多方便而不是要学Activity,Toast,Dialog,PopupWindow这么多个类.你可以思考下底层难还是上层封装难,当然是底层了,android公布简易的封装对象,初级开发者容易上手,见到难的底层谁还会学,是吧?
我们的归属地显示就是用到了
WindowManager是一个系统级服务,负责对顶级布局进行CRUD(这里没有查询)
>权限
>获取WindowManager
windowmg = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
>添加视图
// windowr的布局参数
windowmg.addView(view,//视图
params//布局参数);
注意
第二个为布局参数,这个参数是重点,我们参过他来改变布局的对齐方式gravity,宽度width,高度height,在布局的坐标,能否聚集等等
params = new WindowManager.LayoutParams();
// 对齐 layout_gravity
params.gravity = Gravity.LEFT | Gravity.TOP;
// layout_width layout_height
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
// 类型值
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE// 不能获取焦点
// | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE// 不能touch
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;// 屏幕高亮
// 背景格式
params.format = PixelFormat.TRANSLUCENT;// translucent透明
// 视图类型 调节层次
params.type = WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;
// --------------------获取保存坐标
int x = sp.getInt(Constant.RAW_X, 0);
int y = sp.getInt(Constant.RAW_Y, 0);
params.x = x;
params.y = y;
// 加入布局
windowmg.addView(view, params);
怎么往LinearLayout上放置一个Button,如果是xml布局的话学员早秒了不是?
那要是代码输出这个界面呢?
是不是很麻烦?一方面说明了xml配置的高效,另一方面说明了如果是代码创建界面的话,重要属性都要通过LayoutParams来配置。
// 创建按钮
Button btn = new Button(this);
// 创建布局参数
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(//
LinearLayout.LayoutParams.MATCH_PARENT,// 宽度
LinearLayout.LayoutParams.WRAP_CONTENT// 高度
);
// 设置布局参数
btn.setLayoutParams(params);
// 创建线布局
LinearLayout line = new LinearLayout(this);
line.addView(btn);
>移除视图
注意
view.getParent()!=null的getParent() 是判断一个view是否已经添加到布局里了,如果有返回值不为null,没有就为null,我们当然是把一个添加到布局里面的控件进行移除!!!
if (view != null) {
if (view.getParent() != null) {// 被放到布局文件里面
windowmg.removeView(view);
view = null;
}
}
>更新视图
windowmg.updateViewLayout(view, params);
作业