我很好奇Android如何在Google Keep中看到的共享元素转换中处理英雄视图的子项:
在标准共享元素转换中,在输入动画中,调用活动中的英雄视图会立即覆盖目标视图(在起始维度),然后转换动画将目标视图的维度更改为到他们的新位置。
但是,在返回动画中,返回活动的视图仍保留在叠加层的顶部,它们是在动画结束之前显示的视图,此时目标(调用活动' s) )英雄观点到位。
如果两个英雄视图的内容存在任何差异,这会产生一种非常刺耳的效果 - 例如,线条换行的文本视图或完全不同的子视图。
与此同时,在Google Keep中,共享元素转换似乎会在每个方向上来回淡化内容视图,因此这种不和谐的效果相当不明显。因此,填充或换行等方面的差异要小得多。
我在自己的应用中实现此功能的最佳方法是什么?
这是一个例子:
答案 0 :(得分:6)
我的回答很长。它只提供了重新创建我在动画图像中看到的内容的一般框架,因此您需要花一些时间自己调整内容以使其完美。
代码在此处可见:https://gist.github.com/zizibaloob/e107fe80afa6873301bf234702d4b2b9
tl; dr :"共享元素"只是绿卡/背景,所以你使用它们创建过渡。在第二个活动的背景上放置绿色背景背后的灰色背景,以便绿色在其生长的同时绘制一些东西。将所有内容包装在父视图中,并为其alpha
设置动画以淡入/淡出。
在您的图片中,"共享元素"似乎是第一个屏幕上的绿卡/第二个屏幕的绿色背景。最重要的是,我们还增加了两个要求:
让我们浏览每个文件并谈谈我为达到预期效果而做出的选择......
这个非常简单。我刚建立了一个视图层次结构,模糊地类似于图像中的层次结构。顶部的空View
是Toolbar
的占位符,而卡片底部的Space
就是为了让它更大一些。
此布局的相关部分是" parent"的三重叠加。观点。他们每个人都有一个目的:
FrameLayout
为卡片提供灰色背景,以便"成长"在FrameLayout
提供将在活动之间共享的绿色背景LinearLayout
包含了我们想要淡入/淡出的所有内容,并将通过Activity
类另一个简单的课程。所有这些Activity
都可以使卡片可以点击并设置过渡。
大部分魔法发生在这里。在onCreate()
内,Toolbar
内容都是标准内容,因此我们可以跳过它。 if
语句中的代码用于设置淡入动画(包含在if
中,因此它仅在首次启动时淡入)。我还覆盖了onBackPressed()
以反转淡入淡出动画并触发返回过渡。
所有剩下的魔法都在这个文件中。 <targets>
元素排除状态和导航栏,确保它们在转换期间不会闪烁。各种<changeFoo>
标签是播放的实际过渡动画。
我在Gist中包含它的唯一原因是TransitionTheme
风格。这适用于清单中的OtherActivity
,它设置了我们的自定义转换(来自shared_element_transition.xml
)。