【发布时间】:2012-08-28 13:13:49
【问题描述】:
TL;DR:我正在寻找我称之为“Gmail 三片段动画”场景的完整工作示例。具体来说,我们希望从两个片段开始,如下所示:
对于一些 UI 事件(例如,点击片段 B 中的某物),我们希望:
- 片段 A 从屏幕向左滑出
- Fragment B 滑动到屏幕的左边缘并缩小以占据 Fragment A 腾出的位置
- 片段 C 从屏幕右侧滑入并占据片段 B 腾出的位置
而且,在按下 BACK 按钮时,我们希望反转这组操作。
现在,我看到了很多部分实现;我将在下面回顾其中的四个。除了不完整之外,它们都有自己的问题。
@Reto Meier 为相同的基本问题贡献了this popular answer,表示您将使用setCustomAnimations() 和FragmentTransaction。对于两个片段的场景(例如,您最初只看到片段 A,并希望将其替换为使用动画效果的新片段 B),我完全同意。然而:
- 由于您只能指定一个“进”和一个“出”动画,我看不出您将如何处理三片段场景所需的所有不同动画
- 他的示例代码中的
<objectAnimator>使用以像素为单位的硬连线位置,考虑到不同的屏幕尺寸,这似乎不切实际,但setCustomAnimations()需要动画资源,排除了用Java 定义这些东西的可能性李> - 我不知道用于缩放的对象动画师如何与
LinearLayout中的android:layout_weight之类的东西配合使用,以按百分比分配空间 - 我不知道一开始是如何处理片段 C 的(
GONE?android:layout_weight的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 中的动画让我想拔掉我的头发,而那些看过我的人都知道,这在很大程度上是徒劳的。
【问题讨论】:
-
这不是 Romain Guy 发布的内容吗? curious-creature.org/2011/02/22/…
-
@ferdy182:他没有使用碎片 AFAICT。从视觉上看,这是正确的基本效果,我也许可以将其用作另一个数据点来尝试创建基于片段的答案。谢谢!
-
想一想:标准的电子邮件应用程序在我的 Nexus 7 上具有类似(尽管不完全相同)的行为 — 这应该是开源的。
-
电子邮件应用程序使用自定义的“ThreePaneLayout”,它为左侧视图的位置以及其他两个视图的宽度/可见性设置动画——每个视图都包含相关的片段。
-
嘿@CommonsWare 我不会在这里用我的全部答案来打扰大家,但是有一个与你类似的问题,我给出了一个非常令人满意的答案。所以,只是建议你检查一下(也检查一下 cmets):stackoverflow.com/a/14155204/906362
标签: android android-fragments android-animation