DR: 我正在寻找一个我称之为“ Gmail 三片段动画”场景的 完整的工作样本。具体来说,我们想从两个片段开始,像这样:
对于某些 UI 事件(例如,在片段 B 中点击某些东西) ,我们需要:
并且,在后退按钮上,我们希望这组操作被反转。
现在,我已经看到了许多部分实现; 我将在下面回顾其中的四个。除了不完整,他们都有自己的问题。
@ Reto Meier 为同一个基本问题贡献了 这个流行的答案,表明你将使用 setCustomAnimations()
和 FragmentTransaction
。对于一个包含两个片段的场景(例如,您最初只看到片段 A,并希望使用动画效果将其替换为一个新的片段 B) ,我完全同意。然而:
<objectAnimator>
使用像素的硬连接位置,这似乎是不切实际的,因为屏幕大小不同,然而 setCustomAnimations()
需要动画资源,排除了在 Java 中定义这些东西的可能性LinearLayout
中的 android:layout_weight
分配空间的百分比为基础GONE
?0
的 android:layout_weight
?预动画到0?还有别的吗?)@ Roman Nurik 指出 你可以动画任何属性,包括那些你自己定义的。这可以帮助解决硬连接位置的问题,代价是发明自己的自定义布局管理器子类。这对一些人有所帮助,但我仍然对雷托的其他解决方案感到困惑。
这个糊状物条目的作者展示了一些诱人的伪代码,基本上是说,所有三个片段最初都会驻留在容器中,而片段 C 在一开始通过 hide()
事务操作隐藏起来。然后,当 UI 事件发生时,我们使用 show()
C 和 hide()
A。然而,我不明白这如何处理 B 改变大小的事实。它还依赖于这样一个事实: 你显然可以将多个片段添加到同一个容器中,我不确定这是否是长期可靠的行为(更不用说它应该破坏 findFragmentById()
,尽管我可以接受)。
这篇博文的作者指出 Gmail 根本没有使用 setCustomAnimations()
,而是直接使用对象动画(“你只需要改变根视图的左边距 + 改变右视图的宽度”)。然而,这仍然是一个包含两个片段的解决方案 AFAICT,并且实现再次显示了以像素为单位的硬连接维度。
我将继续深入研究这个问题,所以有一天我可能会自己回答这个问题,但是我真的希望有人已经为这个动画场景找到了三个片段的解决方案,并且可以发布代码(或者与之相关的链接)。Android 中的动画让我很想揪头发,你们中那些见过我的人都知道这是一个很大程度上徒劳无功的尝试。