【发布时间】:2018-01-24 19:30:04
【问题描述】:
我目前正在探索一个有点复杂的 UI,类似于 Google 地图中使用的 BottomSheetBehaviour,其中可以将项目从折叠状态动画化到展开状态。这两种状态之间的转换是使用TransitionManager 框架的场景转换,并且工作得相当好。
我现在正在探索一种将展开的视图拖动再次进入折叠状态的方法,反之亦然,但我没有找到任何明显的方法来手动进行场景转换。
我需要的是:Transition.setAnimatedFraction(0.5f)
基于用户在两个状态之间拖动的百分比。
这里有人知道如何实现这一目标吗?
【问题讨论】:
-
你好@saberrider,你知道如何实现吗?如果您分享您的实现,那就太好了。
-
嗨@AminMousavi 我还没有找到一个好的和干净的方法来做到这一点。我实现我想做的一个非常简单的版本的唯一方法是通过反射获得 Transition.getRunningAnimators(),停止所有这些,然后手动设置动画时间。它在各个地方引起了很多问题,并且绝对没有准备好生产。要正确解决这个问题,基本上需要分别重新设计 TransitionManager 和所有 Transition 类。
-
这是一个尝试的想法 - 创建一个自定义 TimeInterpolator,它根据触摸位置返回 0..1 值。设置场景过渡以使用它。
-
@auval 我在探索过程中走上了这条路。问题是无论你想出什么时间插值器,动画都会在给定的时间后结束。因此,转换将在该时间之后为所有对象设置完成状态。您可能会建议将时间设置为接近无穷大的值,但这会让您遇到 TransitionManager.runningAnimators() 处于不确定状态的情况。为了恢复秩序,您将需要再次使用反射来手动完成所有这些。
-
Animator 类中有 pause()、resume() 和 setDuration()。例如,如果您将非交互式持续时间设置为 300 毫秒,那么在从 srcY 到 dstY 的触摸手势期间,请确保增加持续时间(例如,我们走了 50% 的路) - 到 450 毫秒,根据规范化设置插值器srcY 和 dstY,在到达 dstY 时恢复和暂停。在下一个拖动点重复。
标签: android android-layout material-design android-animation android-transitions