【发布时间】:2015-11-10 23:39:09
【问题描述】:
我在活动之间使用Shared Element Transitions。过渡效果很好,但我想知道共享元素过渡何时结束,以便显示其他内容。
我尝试在要转换到的活动中使用 SharedElementCallback 中的 onSharedElementEnd,但在转换开始之前会调用它。
还有其他我可以监听的回调吗?
【问题讨论】:
标签: android shared-element-transition
我在活动之间使用Shared Element Transitions。过渡效果很好,但我想知道共享元素过渡何时结束,以便显示其他内容。
我尝试在要转换到的活动中使用 SharedElementCallback 中的 onSharedElementEnd,但在转换开始之前会调用它。
还有其他我可以监听的回调吗?
【问题讨论】:
标签: android shared-element-transition
您是否尝试将动画侦听器绑定到onMapSharedElements 内的共享元素视图? ViewCompat.animate(view) 会给你一个新的或缓存的ViewPropertyAnimator(Compat),然后绑定动画监听器应该很简单。不过我没试过。
setEnterSharedElementCallback(new SharedElementCallback() {
@Override
public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
super.onMapSharedElements(names, sharedElements);
View keySharedElementView = sharedElements.get("keySharedElement");
if(keySharedElementView != null){
ViewCompat.animate(keySharedElementView).setListener(new ViewPropertyAnimatorListenerAdapter(){
@Override
public void onAnimationEnd(View view) {
super.onAnimationEnd(view);
}
});
}
}
});
将Transition.Listener 添加到共享元素过渡效果如何?
Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition();
sharedElementEnterTransition.addListener(new TransitionListenerAdapter() {
@Override
public void onTransitionEnd(android.support.transition.Transition transition) {
super.onTransitionEnd(transition);
}
});
【讨论】:
TransitionListenerAdapter 只是Transition.TransitionListener 接口的一个空实现。它可能取自@alex-lockwood 的公共项目:github.com/alexjlockwood/activity-transitions/blob/master/app/…
((Transition) getSharedElementEnterTransition()).addListener(),它永远不会被调用。但!如果我还在 fragmentA 中的同一个转换中添加了一个空侦听器,那么两个侦听器都开始工作¯_(ツ)_/¯。这是一个简单的演示:github.com/Ghedeon/TransitionBug
请尝试onEnterAnimationComplete() 回调您的活动。
我敢打赌,这正是您要找的。p>
@Override
public void onEnterAnimationComplete() {
super.onEnterAnimationComplete();
//your code
}
【讨论】:
getWindow().getSharedElementEnterTransition().addListener()。
这是我在片段中所做的:
Transition sharedElementEnterTransition = getActivity().getWindow().getSharedElementEnterTransition();
sharedElementEnterTransition.addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart(Transition transition) {
}
@Override
public void onTransitionEnd(Transition transition) {
}
@Override
public void onTransitionCancel(Transition transition) {
}
@Override
public void onTransitionPause(Transition transition) {
}
@Override
public void onTransitionResume(Transition transition) {
}
});
【讨论】:
尝试在 Fragment A 而不是 B 上添加 TransitionListener。并使用android.support.transition.Transition
片段 A
val anim = DetailsTransition()
anim.addListener(object : android.support.transition.Transition.TransitionListener
{
override fun onTransitionEnd(transition: android.support.transition.Transition) {
}
override fun onTransitionResume(transition: android.support.transition.Transition) {
}
override fun onTransitionPause(transition: android.support.transition.Transition) {
}
override fun onTransitionCancel(transition: android.support.transition.Transition) {
}
override fun onTransitionStart(transition: android.support.transition.Transition) {
}
})
【讨论】:
我在 Kotlin 中使用导航组件努力做到这一点,但设法让它与它一起工作
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
setAndPostponeEnterAnimation()
_binding = PokemonDetailFragmentBinding.inflate(inflater, container, false)
setInsets()
handleNavigationArgs()
return binding.root
}
private fun setAndPostponeEnterAnimation() {
postponeEnterTransition()
sharedElementEnterTransition = TransitionInflater.from(context)
.inflateTransition(R.transition.shared_element_transition)
addSharedElementListener()
}
private fun addSharedElementListener() {
(sharedElementEnterTransition as TransitionSet).addListener((object :
TransitionListenerAdapter() {
override fun onTransitionEnd(transition: Transition) {
super.onTransitionEnd(transition)
createRevealAnimation()
}
}))
}
所以我可以在开始新动画之前等待共享过渡完成
【讨论】: