取消共享元素转换
Canceling shared element transition
我有两个活动(A 和 B),当我单击一个按钮时,A 中的元素开始动画过渡到 B。但是,我想禁用从 B 返回到 A 时向后播放的相同过渡.
问这个问题之前在网上查了一下,发现有setSharedElementReturnTransition(transition)
和setSharedElementReenterTransition(transition)
两种方法。这些方法在适当的活动 onCreate()
方法中被调用 transition = null
并且没有起作用。
我找到的唯一取消转换的解决方案是在 onBackPressed()
中调用 finish()
而不是 super.onBackPressed()
。还有其他方法可以实现所需的行为吗?
总而言之,当我将向后转换设置为 null 时,没有任何改变 - 转换未被覆盖。
编辑 1. 这是一个代码:
ActivtyA.java
public class ActivityA {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_A);
}
...
@Override
public void onPersonalProfileEditIconClicked() {
Intent intent = new Intent(ActivityA.this, ActivityB.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
View sharedView = avatarView;
String sharedElementName = getString(R.string.profile_avatar);
ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation
(ActivityA.this, sharedView, sharedElementName);
startActivity(intent, transitionActivityOptions.toBundle());
} else startActivity(intent);
}
}
ActivityB.java
public class ActivityB {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_B);
}
...
@Override
public void onBackPressed() {
finish();
}
}
在 XML 个文件(activity_A 和 activity_B)中,sharedView 有 属性 个 transitionName。
themes.xml
<resources>
<style name="theme" parent="Theme.AppCompat.Light.NoActionBar">
...
<item name="android:windowActionModeOverlay">true</item>
<item name="android:windowContentTransitions">true</item>
</style>
</resources>
您可以使用以下代码获得所需的输出:
ActivityA.java
private void startActivityB(){
startActivity(new Intent(ActivityA.this, ActivityB.class));
overridePendingTransition(R.anim.slide_left_to_right, R.anim.slide_right_to_left);
}
无需编写额外的代码
ActivityB.java
@Override
public void onBackPressed() {
//TODO
}
或
如果你想在启动 ActivityB 之后完成 ActivityA,那么
ActivityA.java
private void startActivityB(){
startActivity(new Intent(this, ActivityB.class));
overridePendingTransition(R.anim.slide_left_to_right, R.anim.slide_right_to_left);
finish();
}
ActivityB.java
@Override
public void onBackPressed() {
startActivity(new Intent(ActivityB.this, ActivityA.class));
overridePendingTransition(R.anim.slide_right_to_left, R.anim.slide_left_to_right);
finish();
}
更新支持库后可以取消共享元素转换,无需将 super.onBackPressed();
更改为 finish();
您只需要将(在我的例子中)return/reenter 过渡设置为 null 并在您的视图中更改过渡名称。
getWindow().setSharedElementReturnTransition(null);
getWindow().setSharedElementReenterTransition(null);
view.setTransitionName(null);
我有两个活动(A 和 B),当我单击一个按钮时,A 中的元素开始动画过渡到 B。但是,我想禁用从 B 返回到 A 时向后播放的相同过渡.
问这个问题之前在网上查了一下,发现有setSharedElementReturnTransition(transition)
和setSharedElementReenterTransition(transition)
两种方法。这些方法在适当的活动 onCreate()
方法中被调用 transition = null
并且没有起作用。
我找到的唯一取消转换的解决方案是在 onBackPressed()
中调用 finish()
而不是 super.onBackPressed()
。还有其他方法可以实现所需的行为吗?
总而言之,当我将向后转换设置为 null 时,没有任何改变 - 转换未被覆盖。
编辑 1. 这是一个代码:
ActivtyA.java
public class ActivityA {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_A);
}
...
@Override
public void onPersonalProfileEditIconClicked() {
Intent intent = new Intent(ActivityA.this, ActivityB.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
View sharedView = avatarView;
String sharedElementName = getString(R.string.profile_avatar);
ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation
(ActivityA.this, sharedView, sharedElementName);
startActivity(intent, transitionActivityOptions.toBundle());
} else startActivity(intent);
}
}
ActivityB.java
public class ActivityB {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_B);
}
...
@Override
public void onBackPressed() {
finish();
}
}
在 XML 个文件(activity_A 和 activity_B)中,sharedView 有 属性 个 transitionName。
themes.xml
<resources>
<style name="theme" parent="Theme.AppCompat.Light.NoActionBar">
...
<item name="android:windowActionModeOverlay">true</item>
<item name="android:windowContentTransitions">true</item>
</style>
</resources>
您可以使用以下代码获得所需的输出: ActivityA.java
private void startActivityB(){
startActivity(new Intent(ActivityA.this, ActivityB.class));
overridePendingTransition(R.anim.slide_left_to_right, R.anim.slide_right_to_left);
}
无需编写额外的代码 ActivityB.java
@Override
public void onBackPressed() {
//TODO
}
或
如果你想在启动 ActivityB 之后完成 ActivityA,那么
ActivityA.java
private void startActivityB(){
startActivity(new Intent(this, ActivityB.class));
overridePendingTransition(R.anim.slide_left_to_right, R.anim.slide_right_to_left);
finish();
}
ActivityB.java
@Override
public void onBackPressed() {
startActivity(new Intent(ActivityB.this, ActivityA.class));
overridePendingTransition(R.anim.slide_right_to_left, R.anim.slide_left_to_right);
finish();
}
更新支持库后可以取消共享元素转换,无需将 super.onBackPressed();
更改为 finish();
您只需要将(在我的例子中)return/reenter 过渡设置为 null 并在您的视图中更改过渡名称。
getWindow().setSharedElementReturnTransition(null);
getWindow().setSharedElementReenterTransition(null);
view.setTransitionName(null);