来去电归属地[03]WindowManager创建浮动窗口

摘要

WindowManager我们又要学到的一个重要服务是系统级的服务,这个服务可将一个视图View可以是来自xml布局文件的视图放入一个布局,而且这个布局可以放在其他Activity的上方,可以进行添加,删除,更新视图.这个是一个我们陌生又熟悉的Api

一方面我们刚认识这个api 他的方法如下

windowmg.addView(viewparams);//添加

windowmg.removeView(view);//移除

windowmg.updateViewLayout(viewparams);//更新

另一方面又是我们很熟悉的,因为我们一直用的Activity,Toast,Dialog,PopupWindow的底层是WindowManager。这时候学员们迷惑了。怎么这么强大的类我们怎么不先掌握呢?我们只要掌握一个类多方便而不是要学Activity,Toast,Dialog,PopupWindow这么多个类.你可以思考下底层难还是上层封装难,当然是底层了,android公布简易的封装对象,初级开发者容易上手,见到难的底层谁还会学,是吧?

我们的归属地显示就是用到了

原理

WindowManager是一个系统级服务,负责对顶级布局进行CRUD(这里没有查询)

>权限

 <!-- 浮动视图的添加权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

>获取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布局的话学员早秒了不是?

<LinearLayout ...
  <Button id="@+id/btn"
     ..wrap_content
     ...match_content />
/LinearLayout>

那要是代码输出这个界面呢?

是不是很麻烦?一方面说明了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);

作业


发布了32 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u013621398/article/details/33448529