【问题标题】:Shared element transition between replaced views替换视图之间的共享元素转换
【发布时间】:2015-08-10 03:36:03
【问题描述】:
我有一个使用 removeView() 删除的视图,然后是一个用 addView() 替换它的视图。这两个视图都在 FrameLayout 中。我希望能够在这些布局中的两个共享图像之间进行共享元素转换,但真的不知道如何去做,因为 android 工具似乎是用你会的(也许是合理的)想法构建的只有在活动或片段之间共享元素转换。
目前我最好的想法是自己尝试制作动画。我会通过将图像的副本绘制到 viewOverlay 上来做到这一点,删除第一个视图,添加第二个可见视图,将其动画到第二个视图中的位置,然后使第二个视图可见。如果可行,我将尝试这条路线并回答我自己的问题,但我希望找到一种更本地化的方法。
【问题讨论】:
标签:
android
android-layout
android-animation
android-view
android-transitions
【解决方案1】:
我尝试自己的动画的想法绝对是错误的路线(尽管它确实有效)。我发现,如果你有被替换的视图,那么在某些方面共享内容实际上会更容易。大多数文档都是关于使用带有 Activity 和 Fragment 的转换,但它们的核心实际上是围绕不断变化的视图构建的。
这个帖子http://blog.stylingandroid.com/transition-animation-part-1/对我帮助很大。
基本上我正在做的是:
// above I've gotten the sharedElements (Views)...
newSharedElement.setTransitionName("sharedProperty");
oldSharedElement.setTransitionName("sharedProperty");
// having android:transitionName in the xml can be easier
// This transition handles the shared element move based on the shared tansition name
Transition shared = TransitionInflater.from(context).inflateTransition(android.R.transition.move);
shared.addTarget(newSharedElement);
// create a scene container is a parentView (FrameLayout) of both children
Scene scene = new Scene(container, newChild);
// everything else is set to Fade, shared element is excluded
Transition fade = TransitionInflater.from(context).inflateTransition(android.R.transition.fade);
fade.excludeTarget(newSharedElement, true);
// combine the translations
TransitionSet set = new TransitionSet();
set.addTransition(shared).addTransition(fade);
// translationize
TransitionManager.go(scene, set);
Android 允许以多种方式完成转换的每个步骤,因此如果这不完全适合您的用例,则有很多选择。
感谢Shared Element Transitions Between Views (not Activities or Fragments),也可寻求帮助。