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

来源:互联网 发布:什么是软件集成测试 编辑:程序博客网 时间:2024/04/27 22:44

摘要

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_gravityparams.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);

作业


0 0
原创粉丝点击