标签搜索

Android灵动岛的一种实现

Pop.Kite
2023-01-26 / 0 评论 / 381 阅读 / 正在检测是否收录...

你能得到

  • 通过绑定服务在Service中动态添加悬浮窗
  • 通过属性动画设置悬浮窗的大小变化的动画
  • Android各类插值器应用在属性动画上的效果
  • Kotlin的基础语法应用,如let、apply
  • MutableLiveData的应用(没有单独的ViewMode类,简单使用)
  • 触摸事件的分发(因为WindowManager添加的View上层并非DecorView,因此重写悬浮窗的布局不能够将触摸事件透传到屏幕,因此触摸事件的分发可能用不上)

方案设计
方案一
TransitionManager 切换视图动画
使用Transition进行视图间的切换,需要设置SceneRoot,以及每个状态对应的Scene;
由于悬浮窗外的区域应该是可以点击并被响应的,因此需要设置悬浮窗的LayoutParams的宽高属性都是WRAP_CONTENT,但是若如此则切换View的时候动画效果会有截断效果;如果在切换View前先将宽高属性设置为MATCH_PARENT,切换完毕后再还原为WRAP_CONTENT,那在updateViewLayout的时候悬浮窗会抖动,可能是由于动画造成的,暂时没有合适的解决方案。

方案二
ValueAnimator 属性动画切换视图
使用Windowsmanager添加RootView,其中含一个FrameLayout作为动态添加的视图的根布局,同时在FrameLayout布局上设置背景图片,可以保证各种视图下的背景一致。
工具类会记录上次视图的宽高信息,当切换视图传入view时,会测量传入view的宽高,然后使用属性动画将上次的视图宽高通过指定的插值器过渡到本次view的宽高。此种方案可以实现悬浮窗外的点击事件被响应,缺点是频繁的updateViewLayout卡顿会比较明显。
效果如下:
2_1674376668.mp4

方案三
透传所有事件的全屏悬浮窗 + 不可透传事件的悬浮窗内子View
需要System级别的APP设置Window的Type,第三方APP暂时做不了。

代码一览
参加GitHub
https://github.com/popkter/Dynamic_Island_Android_Demo

4

评论 (0)

取消