android 悬浮窗 输入框_利用DecorView实现悬浮窗的效果

由于众所周知的原因,Android系统虽然提供了悬浮窗的功能,但使用之前需要用记授权,有些手机对这个授权还要再次确认,以至于很多用户出于谨慎的目地就不去打开了。但我们在实际开发当中却又需要这个功能是该怎么? 既然直接使用是不行了,那只能考虑折中的办法了。首先能想到的是把悬浮窗作在XML布局里面,不用时隐藏,需要时显示。但如果我们遇到一批需要悬浮窗的界面时要怎么办?有一个比较稳妥的方法;从DecorView下手! 我们知道Activity对于界面的加载是交给自己的手下PhoneWindow去处理的,PhoneWindow再交给自己的手下DecorView。DecorView虽然是一个FrameLayout的自定义类,理论上由它来加载就可以了,但DecorView还挺能整活,它不直接加载我们定义的XML布局,而是先加载了一个系统内置的布局,这个内置的布局是LinearLayout结构的,上面是一个标题区,下面是内容区,内容区就是一个FrameLayout,并且有一个系统级的ID作为标记。这个内置布局结构如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:fitsSystemWindows="true"    android:orientation="vertical">    <ViewStub android:id="@+id/action_mode_bar_stub"              android:inflatedId="@+id/action_mode_bar"              android:layout="@layout/action_mode_bar"              android:layout_width="match_parent"              android:layout_height="wrap_content"              android:theme="?attr/actionBarTheme" />    <FrameLayout         android:id="@android:id/content"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:foregroundInsidePadding="false"         android:foregroundGravity="fill_horizontal|top"         android:foreground="?android:attr/windowContentOverlay" />LinearLayout>
我们自定义的XML布局就是被加载到这个ID为content的FrameLayout里的。由于这是一个系统内置的布局,每一个Activity都有,所以我们可以充分利用这一便利来给实现我们的悬浮窗效果。

大致的思路是这样的:

  1. 自定义一个Activity子类专门用于处理悬浮窗的操作,在项目中需要用到悬浮窗的地方就继承这个类。

  2. 在自定义的Activity子类中通过findViewById(android.R.id.content)获取到系统内置的内容布局(ContentFrameLayout)。

  3. 自定义一个View作为我们的悬浮窗,然后将这个View添加到内容布局。

在上述步骤之前ID为content的内容布局之下原本只有一个子布局,即我们在setContentView里指定的XML布局资源,执行了上述步骤之后内容布局又会多出一个子布局,由于内容布局本身就是一个FrameLayout,所以后加的布局自然放在最上层,这就是悬浮窗的效果了。

下面就来实例个带拖动效果的悬浮窗

7cf30ce2d96e08bd68c842b8eb51825d.gif

悬浮窗带拖动效果

先自定义一个FloatActivity,封装一下悬浮窗的功能。由于我们的悬浮窗是带有拖动功能的,所以还需要把窗体的坐标保存在配置文件里,以便于Activity在跳转的时

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值