Android的WindowManager

534 阅读2分钟

一、简介

windowManager是Android的系统服务SystemService中的重要一员,用于将View动态添加移除更新到window中。

二、三个方法

// 添加view
public void addView(View view, ViewGroup.LayoutParams params);

// 更新view
public void updateViewLayout(View view, ViewGroup.LayoutParams params);

// 移除
public void removeView(View view);

三、两要素

View

需要有一个被添加的View。

WindowManager.LayoutParams

WindowManager.LayoutParams也是ViewGroup.LayoutParams的一个子类。 WindowManager.LayoutParams的参数type指定了window的类型,包括如下三种类型:

  • Application windows(值从1~99),该类型window的token必须被设置成activity的token(token:标识一个window)。应用内的一些小浮球就是该类型window。
  • Sub-windows(值从1000~1999),它关联于另一个顶级的window,该类型window的token必须是关联window的token。对话框就是该类型的window。
  • System windows(值为2000~2999),该类型的window通常是系统因特殊目的所使用的,不应该被普通应用所使用,且使用需要申请指定的权限(系统权限中的悬浮窗权限)。系统的通知栏就是该类型window。 WindowManager.LayoutParams的参数flags用于设置各种行为,比如:
  • 状态栏透明(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
  • 导航栏透明(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION
  • 不获取焦点(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)(注意:如果设置该属性,window通过setOnKeyListener监听back事件会无效)
  • 不响应触摸事件(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE) 如果要对系统UI进行设置,可以通过WindowManager.LayoutParams的参数systemUiVisibility。 | Flag | 含义 | | --- | --- | | SYSTEM_UI_FLAG_LOW_PROFILE| 弱化状态栏和导航栏的图标 | |SYSTEM_UI_FLAG_HIDE_NAVIGATION|隐藏导航栏,用户点击屏幕会显示导航栏| |SYSTEM_UI_FLAG_FULLSCREEN|隐藏状态栏 |SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION|拓展布局到导航栏后面 |SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|拓展布局到状态栏后面 |SYSTEM_UI_FLAG_LAYOUT_STABLE|稳定的布局,不会随系统栏的隐藏、显示而变化 |SYSTEM_UI_FLAG_IMMERSIVE|沉浸模式,用户可以交互的界面 |SYSTEM_UI_FLAG_IMMERSIVE_STICKY|沉浸模式,用户可以交互的界面。同时,用户上下拉系统栏时,会自动隐藏系