如何知道 activity 是否在没有转换的情况下开始?
How can one know if an activity is started without a transition?
我有一个用例,在该用例中,我主要使用过渡启动 activity,但从导航抽屉打开它时情况并非如此。
为了保持过渡平稳,我有一个 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();
}
}
}
这在使用动画启动 Activity 时效果很好,但是 我怎么知道 Activity 是否在没有过渡的情况下启动,以便我可以调用 doSomeUiUpdating()
?
我确定 Activity
、Window
、Transition
或我忽略的地方一定有一个简单的方法。我不想继续调用 Activity 来设置一些指示动画是否显示的包。
您可以尝试 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();
}
}
}
由于您正在启动 Activity
,因此您将使用 Intent
来启动它。您可以向 Intent
添加额外内容并在被调用 Activity
的 onCreate()
中检查它们。
假设我们有 2 个活动 – ActivityA
和 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);
}
现在,如果您注意到上面的内容,我已经使用 putExtra()
方法传递了一个额外的 Intent
。我已将 Boolean
值传递给 true,因为我打算用 SharedElementTransition
启动 Activity。
现在在 ActivityB
的 onCreate()
方法中,您可以只检查传递给 Intent
的布尔值。如果你传递了 false,那么你可以添加一个条件语句并在那里执行你的 UI 更新。我在下面给了你一个小片段来帮助你开始:
private static final String isSharedElementTransitionEnabled = "IS_SHARED_ELEMENT_TRANSITION_ENABLED";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
// If you are postponing your SharedElementTransition, don't forget to call postponeEnterTransition() and override onPreDraw()
if (!getIntent().getExtras().getBoolean(isSharedElementTransitionEnabled)) {
//Do your UI updation here
}
}
这样做的好处是您可以完全控制内容转换和共享元素转换的效果。
我有一个用例,在该用例中,我主要使用过渡启动 activity,但从导航抽屉打开它时情况并非如此。
为了保持过渡平稳,我有一个 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();
}
}
}
这在使用动画启动 Activity 时效果很好,但是 我怎么知道 Activity 是否在没有过渡的情况下启动,以便我可以调用 doSomeUiUpdating()
?
我确定 Activity
、Window
、Transition
或我忽略的地方一定有一个简单的方法。我不想继续调用 Activity 来设置一些指示动画是否显示的包。
您可以尝试 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();
}
}
}
由于您正在启动 Activity
,因此您将使用 Intent
来启动它。您可以向 Intent
添加额外内容并在被调用 Activity
的 onCreate()
中检查它们。
假设我们有 2 个活动 – ActivityA
和 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);
}
现在,如果您注意到上面的内容,我已经使用 putExtra()
方法传递了一个额外的 Intent
。我已将 Boolean
值传递给 true,因为我打算用 SharedElementTransition
启动 Activity。
现在在 ActivityB
的 onCreate()
方法中,您可以只检查传递给 Intent
的布尔值。如果你传递了 false,那么你可以添加一个条件语句并在那里执行你的 UI 更新。我在下面给了你一个小片段来帮助你开始:
private static final String isSharedElementTransitionEnabled = "IS_SHARED_ELEMENT_TRANSITION_ENABLED";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
// If you are postponing your SharedElementTransition, don't forget to call postponeEnterTransition() and override onPreDraw()
if (!getIntent().getExtras().getBoolean(isSharedElementTransitionEnabled)) {
//Do your UI updation here
}
}
这样做的好处是您可以完全控制内容转换和共享元素转换的效果。