WindowManager对于窗口的管理以及悬浮窗的实现

WindowManager

WindowManager是窗口管理器, 所有显示窗口都可以通过它来控制

  • WindowManager.addView(view, layoutParams)
    添加一个View到窗口中
  • WindowManager.updateView(view, layoutParams)
    更新窗口中的View属性
  • WindowManager.removeView(view)
    删除窗口中的View

WindowManager.LayoutParams

获取布局参数

     
     
     
WindowManager.LayoutParams params = getWindow().getAttributes() ;

创建布局参数

     
     
     
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
WindowManager.LayoutParams.type

用于确定窗口在屏幕上的显示层次

  • FIRST_APPLICATION_WINDOW
    普通应用的第一个窗口
  • TYPE_BASE_APPLICATION
    作为所有应用基础的窗口, 其他应用窗口都在其上
  • TYPE_APPLICATION
    普通应用窗口. token必须为Activity的token, 指明该窗口属于谁
  • TYPE_APPLICATION_STARTING
    应用启动时显示的窗口. 用于系统在应用能够显示之前显示一些东西
  • LAST_APPLICATION_WINDOW
    应用最后一种窗口类型
  • FIRST_SUB_WINDOW
    子窗口
  • TYPE_APPLICATION_PANEL
    在应用窗口之上的面板窗口, 出现在所依附的窗口之上
  • TYPE_APPLICATION_MEDIA
    显示媒体(如视频)的窗口, 在他们依附的窗口之下显示
  • TYPE_APPLICATION_SUB_PANEL
    应用窗口之上的子面板窗口, 显示在所依附的窗口和其他面板之上
  • TYPE_APPLICATION_ATTACHED_DIALOG
    类似TYPE_APPLICATION_PANEL, 但会作为顶层窗口, 而不是容器的子窗口
  • TYPE_APPLICATION_MEDIA_OVERLAY
    隐藏
    在媒体窗口上显示覆盖层的窗口
    显示在TYPE_APPLICATION_MEDIA和应用窗口之间
  • TYPE_APPLICATION_ABOVE_SUB_PANEL
    一个子面板窗口, 在应用窗口和子面板窗口之上
  • LAST_SUB_WINDOW
    最后一个子窗口
  • FIRST_SYSTEM_WINDOW
    第一个系统窗口
  • TYPE_STATUS_BAR
    状态栏
    只能有一个状态栏窗口. 放置在屏幕上方, 其他所有窗口都在其之下
  • TYPE_SEARCH_BAR
    搜索条
    只能有一个搜索条窗口, 放置在屏幕顶层
  • TYPE_PHONE
    电话窗口
    这是非应用窗口, 用于来电的界面
    该窗口通常置于所有应用之上, 但在状态栏下
  • TYPE_SYSTEM_ALERT
    系统窗口, 例如低电量警告弹窗, 在应用窗口之上
  • TYPE_KEYGUARD
    锁屏窗口
  • TYPE_TOAST
    透明通知. 不会拦截触摸事件, 可以向下透传
  • TYPE_SYSTEM_OVERLAY
    系统覆盖窗口, 在所有东西之上. 该窗口必须禁止获取输入焦点, 否则会变成锁屏
  • TYPE_PRIORITY_PHONE
    优先级电话, 即使锁屏也会显示
    该窗口必须禁止获取输入焦点, 否则会变成锁屏
  • TYPE_SYSTEM_DIALOG
    状态栏拉出的面板
  • TYPE_KEYGUARD_DIALOG
    锁屏
  • TYPE_SYSTEM_ERROR
    系统错误窗口, 在所有内容之上
  • TYPE_INPUT_METHOD
    输入法窗口, 在普通UI之上
    可以缩放
  • TYPE_INPUT_METHOD_DIALOG
    输入法对话框窗口, 在当前输入法窗口之上
  • TYPE_WALLPAPER
    壁纸窗口, 在任意窗口之下, 壁纸之上
  • TYPE_STATUS_BAR_PANEL
    状态栏拉出的面板
  • TYPE_SECURE_SYSTEM_OVERLAY
    安全的系统覆盖窗口, 在所有内容之上
    必须禁止获取输入焦点, 否则会变成锁屏
    同TYPE_SYSTEM_OVERLAY类似, 区别是只允许系统创建这种覆盖层, 应用无法创建
  • TYPE_DRAG
    拖拽窗口
    最多有一个, 在所有窗口之上
  • TYPE_STATUS_BAR_SUB_PANEL
    状态栏拉出的面板, 在状态栏之下
  • TYPE_POINTER
    鼠标指针
  • TYPE_NAVIGATION_BAR
    导航条
  • TYPE_VOLUME_OVERLAY
    调整音量时显示的音量窗口
  • TYPE_BOOT_PROGRESS
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现悬浮窗返回按键功能,可以按照以下步骤进行。 1. 在布局文件中添加一个ImageView控件,并设置返回图标作为其背景。 2. 在代码中定义一个WindowManager对象,用于创建悬浮窗。 3. 在创建悬浮窗时,设置悬浮窗的参数,包括宽度、高度、位置等。 4. 在悬浮窗中添加一个触摸事件监听器,当手指点击返回图标时,关闭悬浮窗。 以下是一个示例代码: //定义WindowManager对象 private WindowManager windowManager; private WindowManager.LayoutParams layoutParams; ... //在onCreate中初始化 windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); layoutParams = new WindowManager.LayoutParams(); //设置悬浮窗类型为系统级别 layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; //设置悬浮窗的宽度和高度 layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT; layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; //设置悬浮窗的位置 layoutParams.gravity = Gravity.TOP | Gravity.RIGHT; ... //创建悬浮窗布局 View floatingView = LayoutInflater.from(this).inflate(R.layout.floating_layout, null); //获取返回图标 ImageView backButton = floatingView.findViewById(R.id.back_button); //添加触摸事件监听器 backButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { //关闭悬浮窗 windowManager.removeView(floatingView); } return true; } }); //添加悬浮窗 windowManager.addView(floatingView, layoutParams); 需要注意的是,悬浮窗类型为系统级别时,需要声明SYSTEM_ALERT_WINDOW权限。同时,由于悬浮窗不受Activity生命周期的影响,需要在关闭窗口时手动进行清理,否则可能会引起内存泄漏问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值