【问题标题】:TransitionManager progress manuallyTransitionManager 手动进度
【发布时间】: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


【解决方案1】:

将您的父级ViewGroup(无论是ConstraintLayoutRelativeLayout 或其他任何内容)迁移到MotionLayout,您可以使用MotionLayout.progress (setProgress(float)) 和loadLayoutDescription 来实现此目的,这使您能够处理运动场景中描述的场景转换的手动进度。

请看例子here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 2020-08-10
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多