如何知道共享元素转换何时结束

tyc*_*czj 29 android shared-element-transition

Shared Element Transitions在活动之间工作.转换工作正常,但我想知道共享元素转换何时结束,以便我可以显示其他内容.

我尝试onSharedElementEndSharedElementCallback我转换到的活动中使用in ,但在转换开始之前调用它.

还有我可以听的另一个回调吗?

Nik*_*ski 33

您是否尝试将动画侦听器绑定到内部的共享元素视图onMapSharedElementsViewCompat.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);
                        }
                    });
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

如何添加Transition.Listener到共享元素转换?

 Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition();
 sharedElementEnterTransition.addListener(new TransitionListenerAdapter() {
         @Override
          public void onTransitionEnd(android.support.transition.Transition transition) {
                    super.onTransitionEnd(transition);
           }
      });
Run Code Online (Sandbox Code Playgroud)

  • 只有第二种解决方案适合我. (5认同)
  • 对于其他任何想知道的人来说,`TransitionListenerAdapter`只是`Transition.TransitionListener`接口的一个空实现.它可能来自@ alex-lockwood的公共项目:https://github.com/alexjlockwood/activity-transitions/blob/master/app/src/main/java/com/alexjlockwood/activity/transitions/TransitionListenerAdapter. java的 (4认同)
  • @HugoGresse这是一个很好的问题.我希望有人能够证实这种奇怪的行为:简单过渡,fragmentA到fragmentB(v4).我想知道的是过渡时期结束了.所以我把一个监听器放在fragmentB中,如:`((Transition)getSharedElementEnterTransition()).addListener()`永远不会被调用.但!如果我还在fragmentA中的同一个转换中添加一个空的侦听器,那么两个侦听器都会开始工作¯\ _(ツ)_ /¯.这是一个简单的演示:https://github.com/Ghedeon/TransitionBug (4认同)
  • 碎片怎么样?这两种解决方案对我都不起作用 (3认同)
  • @Ghedeon你试过在fragmentB的"onAttach()"中调用"addListener()"吗?就像这里:https://github.com/google/iosched/blob/e8c61e7e23f74aa6786696dad22e5136b423a334/android/src/main/java/com/谷歌/样品/应用/ iosched /会话/ SessionDetailFragment.java (2认同)

Ale*_*Wih 18

请尝试onEnterAnimationComplete()回调您的活动.

我打赌这正是你正在寻找的.

 @Override
    public void onEnterAnimationComplete() {
        super.onEnterAnimationComplete();

    //your code 
    }
Run Code Online (Sandbox Code Playgroud)

  • 看起来很棒,但是有关如何将它与Fragment过渡一起使用的任何建议吗? (2认同)
  • 这对我来说不是很好。太早了。添加日志,您将看到。起作用的是`getWindow()。getSharedElementEnterTransition()。addListener()`。 (2认同)

Kai*_*ang 6

这是我在片段中所做的:

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) {

        }
    });
Run Code Online (Sandbox Code Playgroud)