如何知道一项活动是否在没有过渡的情况下开始?

时间:2016-02-22 20:27:20

标签: android android-animation android-transitions

我有一个用例,我主要通过转换启动一个活动,但从导航抽屉打开它时不是这种情况。

为了保持过渡顺利,我有一个Transition.TransitionListener,在转换完成后我会触发一些UI更新。

所以我有这样的事情:

public class SomeActivity extends Activity {

    public void onCreate(Bundle savedInstanceState){ 
        // ...
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition();
            sharedElementEnterTransition.addListener(new Transition.TransitionListener() {
                // ...
                @Override
                public void onTransitionEnd(Transition transition) {
                    doSomeUiUpdating();
                }
            });
        } else { // Pre-Lollipop
            doSomeUiUpdating();
        }
    }
}

这在使用动画启动活动时效果很好,但如何知道活动是否在没有转换的情况下启动,以便我可以调用doSomeUiUpdating()

我确信在ActivityWindowTransition或某个我忽略的地方必须有一个简单的方法。我不想在调用Activity上中继设置一些告诉动画是否显示的包。

2 个答案:

答案 0 :(得分:4)

您可以尝试onTransitionStart TransitionListener来设置一些布尔值isAnimationStarted

public class SomeActivity extends Activity {

    private boolean isAnimationStarted = false;

    public void onCreate(Bundle savedInstanceState) { 
        // ...
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            Transition sharedElementEnterTransition = getWindow().getSharedElementEnterTransition();
            sharedElementEnterTransition.addListener(new Transition.TransitionListener() {
                // ...
                @Override
                public void onTransitionEnd(Transition transition) {
                    doSomeUiUpdating();
                }

                @Override
                public void onTransitionStarted(Transition transition) {
                    isAnimationStarted = true;
                }
            });
        }
    }

    public void onStart() {
        if (!isAnimationStarted) {
            doSomeUiUpdating();
        }
    }

}

答案 1 :(得分:2)

由于您正在开始Activity,因此您将使用Intent启动它。您可以向Intent添加额外内容,并在被叫onCreate()的{​​{1}}中进行检查。

我们假设我们有2项活动 - ActivityActivityA

现在,我们假设ActivityB是调用ActivityA,而Activity是被调用的ActivityB

Activity中,我们假设您已经编写了一些代码,以ActivityA启动ActivityB

SharedElementTransition

现在,如果您注意到上述情况,我已使用@Override public void onClick(View v) { Intent startActivityBIntent = new Intent(getContext(), ActivityB.class); startActivityBIntent.putExtra("IS_SHARED_ELEMENT_TRANSITION_ENABLED", true); ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), view, ViewCompat.getTransitionName(view)); startActivity(startActivityBIntent, activityOptionsCompat); } 方法通过了Intent个额外内容。我已经传递了putExtra()值为true,因为我打算用Boolean启动活动。

现在在SharedElementTransition的{​​{1}}方法中,您只需检查传递给ActivityB的布尔值。如果您传递了false,那么您可以添加条件语句并在那里执行UI更新。我已经在下面给你一个小片段来帮助你开始:

onCreate()

这样做的好处是,您可以完全控制内容过渡的方式以及共享元素过渡的效果。