我正在寻找一个完整的工作示例,我将其称为“Gmail三片段动画”场景。具体地说,我们希望从两个片段开始,如下所示:
在一些UI事件(例如,点击片段B中的某些内容)时,我们希望:
而且,在按下BACK按钮时,我们希望这组操作被反转。
现在,我已经看到了很多部分实现;我将在下面回顾其中的四个。除了不完整之外,它们都有自己的问题。
@Reto Meier为同样的基本问题贡献了this popular answer,表明您将使用带有FragmentTransaction
的setCustomAnimations()
。对于两个片段的场景(例如,您最初只看到片段A,并希望使用动画效果将其替换为新的片段B),我完全同意。但是:
<objectAnimator>
在他的示例代码中使用以像素为单位的硬连接位置,考虑到不同的屏幕大小,这似乎是不切实际的,但是setCustomAnimations()
需要动画资源。排除了在JavaLinearLayout
中的android:layout_weight
之类的东西绑定在一起,GONE
?android:layout_weight
of 0
?预置动画到0的比例?还有别的吗?)@Roman Nurik指出,you can animate any property,包括你自己定义的那些。这可以帮助解决硬连接位置的问题,代价是创建自己的自定义布局管理器子类。这对一些人有帮助,但我仍然对Reto的其余解决方案感到困惑。
this pastebin entry的作者展示了一些诱人的伪代码,基本上是说所有三个片段最初都驻留在容器中,片段C在一开始就通过hide()
事务操作隐藏起来。然后,当UI事件发生时,我们show()
C和hide()
A。然而,我不明白这是如何处理B改变大小的事实的。它还依赖于这样一个事实,即您显然可以向同一容器添加多个片段,我不确定这是否是长期可靠的行为(更不用说它应该破坏findFragmentById()
,尽管我可以接受)。
this blog post的作者指出,Gmail根本没有使用setCustomAnimations()
,而是直接使用对象动画(“你只需改变根视图的左边距+改变右视图的宽度”)。然而,这仍然是一个两个片段的解决方案AFAICT,并且实现再次显示了以像素为单位的硬连接尺寸。
我将继续努力,所以有一天我可能会自己回答这个问题,但我真的希望有人已经为这个动画场景制定了三个片段的解决方案,并可以发布代码(或指向该代码的链接)。Android中的动画让我想要拔出我的头发,你们中看过我的人都知道这基本上是徒劳的努力。
https://stackoverflow.com/questions/12253965
复制相似问题