TransitionManager手动进度

12

我目前正在研究一个与Google地图中使用的BottomSheetBehaviour类似的复杂UI,可以将一个项从折叠状态动画展开到扩展状态。这两种状态之间的过渡是使用TransitionManager框架进行的场景过渡,并且效果相当不错。

我现在正在探索一种方法,可以再次将扩展视图拖回折叠状态,反之亦然,但我没有找到手动推进场景过渡的明显方法。

我需要的是像这样的东西:Transition.setAnimatedFraction(0.5f),基于用户在2个状态之间拖动的百分比。

这两个状态之间的拖动过渡

这里有人有任何实现这个功能的想法吗?


你好@saberrider,你找到如何实现这个功能了吗?如果你能分享一下你的实现方法就太好了。 - Amin Mousavi
嗨 @AminMousavi,我还没有找到一个好的、干净的方法来做这件事。我所做的只是通过反射获得Transition.getRunningAnimators(),停止它们所有,然后手动设置动画时间,从而实现了我想要做的简单版本。 这在各个地方都会引起很多问题,绝对不适合生产环境。 要正确解决这个问题,基本上需要重新设计TransitionManager和所有的Transition类。 - saberrider
这里有一个尝试的想法 - 创建一个自定义的TimeInterpolator,根据触摸位置返回0..1值。将场景转换设置为使用它。 - Amir Uval
@auval 我在探索过程中也曾走过这条路。问题在于,无论你使用什么时间插值器,动画都会在一定的时间后结束。因此,转换将在那个时间之后设置所有对象的完成状态。你可能会建议将时间设置为接近无限大的值,但这会导致TransitionManager.runningAnimators()处于一种悬而未决的状态。为了恢复秩序,你需要再次使用反射手动完成它们。 - saberrider
这正是我最终所做的,并且我在上面描述了一些评论。问题是,如果没有反射,您将无法获得所有涉及的动画师,除非您分叉整个transitionManager框架。 - saberrider
显示剩余2条评论
1个回答

4
迁移您的父ViewGroup(无论是ConstraintLayoutRelativeLayout还是其他任何内容)到MotionLayout,您可以使用MotionLayout.progresssetProgress(float))和loadLayoutDescription来手动处理场景转换的进度,这使您具有更强大的控制能力。请参见此处的示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接