共享元素转换被其他视图阻止
Shared element transition blocked by other views
我正在尝试实现共享元素转换,我将一些文本从一个片段共享到另一个片段。在我尝试将它与 Fade
转换结合之前,实际的共享元素动画效果很好。现在共享元素隐藏在其他淡入淡出的内容后面,并且只有在淡出结束后才可见。
我正在从片段 A 到片段 B 制作动画。
在片段 A 中,我在 onCreate
中设置 exitTransition
属性,如下所示:
exitTransition = Fade()
在片段 B 中,我也在 onCreate
中设置 enterTransition
属性:
enterTransition = Fade()
实际的共享元素转换正在包含 activity:
中触发
supportFragmentManager.commit {
replace(R.id.fragmentContainer, FragmentB.newInstance())
addSharedElement(sharedView, "transition_name")
setReorderingAllowed(true)
addToBackStack(null)
}
正在片段 B 的 onCreate
中设置用于共享元素的动画:
TransitionSet set = new TransitionSet();
set.setOrdering(TransitionSet.ORDERING_TOGETHER);
Transition changeBounds = new ChangeBounds();
changeBounds.addTarget(R.id.logo);
changeBounds.addTarget("logo_transition_name");
set.addTransition(changeBounds);
ChangeTransform changeTransform = new ChangeTransform();
changeTransform.addTarget(R.id.logo);
changeTransform.addTarget("logo_transition_name");
set.addTransition(changeTransform);
Transition textSize = new TextSizeTransition();
textSize.addTarget(R.id.logo);
textSize.addTarget("logo_transition_name");
set.addTransition(textSize);
sharedElementEnterTransition = set;
我错过了什么?
这里有一张 gif 供参考:
最终,我通过在正在转换的徽标 TextView
上设置 scale
来解决此问题。
具体来说,我从之前由 George Mount 撰写的堆栈溢出答案中了解到,ChangeTransform
转换将(有点神奇地)处理共享元素视图的重新父级处理,这样它就不会被另一种观点。
在调试 ChangeTransform
转换后,我发现它的 createAnimator
方法从未被调用过。看起来这是因为正在共享的视图在片段 A 和片段 B 之间没有任何缩放或旋转变化。
在片段 A 中的徽标 TextView
上设置 0.99 的比例会导致 createAnimator
方法被调用并且视图正确地过渡 超过 其他视图而不是在他们下面。
我 怀疑 因为人们通常共享图像视图,所以两个图像之间通常存在比例差异,所以这个问题没有那么明显。我可能是错的。
我正在尝试实现共享元素转换,我将一些文本从一个片段共享到另一个片段。在我尝试将它与 Fade
转换结合之前,实际的共享元素动画效果很好。现在共享元素隐藏在其他淡入淡出的内容后面,并且只有在淡出结束后才可见。
我正在从片段 A 到片段 B 制作动画。
在片段 A 中,我在 onCreate
中设置 exitTransition
属性,如下所示:
exitTransition = Fade()
在片段 B 中,我也在 onCreate
中设置 enterTransition
属性:
enterTransition = Fade()
实际的共享元素转换正在包含 activity:
中触发supportFragmentManager.commit {
replace(R.id.fragmentContainer, FragmentB.newInstance())
addSharedElement(sharedView, "transition_name")
setReorderingAllowed(true)
addToBackStack(null)
}
正在片段 B 的 onCreate
中设置用于共享元素的动画:
TransitionSet set = new TransitionSet();
set.setOrdering(TransitionSet.ORDERING_TOGETHER);
Transition changeBounds = new ChangeBounds();
changeBounds.addTarget(R.id.logo);
changeBounds.addTarget("logo_transition_name");
set.addTransition(changeBounds);
ChangeTransform changeTransform = new ChangeTransform();
changeTransform.addTarget(R.id.logo);
changeTransform.addTarget("logo_transition_name");
set.addTransition(changeTransform);
Transition textSize = new TextSizeTransition();
textSize.addTarget(R.id.logo);
textSize.addTarget("logo_transition_name");
set.addTransition(textSize);
sharedElementEnterTransition = set;
我错过了什么?
这里有一张 gif 供参考:
最终,我通过在正在转换的徽标 TextView
上设置 scale
来解决此问题。
具体来说,我从之前由 George Mount 撰写的堆栈溢出答案中了解到,ChangeTransform
转换将(有点神奇地)处理共享元素视图的重新父级处理,这样它就不会被另一种观点。
在调试 ChangeTransform
转换后,我发现它的 createAnimator
方法从未被调用过。看起来这是因为正在共享的视图在片段 A 和片段 B 之间没有任何缩放或旋转变化。
在片段 A 中的徽标 TextView
上设置 0.99 的比例会导致 createAnimator
方法被调用并且视图正确地过渡 超过 其他视图而不是在他们下面。
我 怀疑 因为人们通常共享图像视图,所以两个图像之间通常存在比例差异,所以这个问题没有那么明显。我可能是错的。