取消共享元素转换

时间:2017-01-23 11:32:43

标签: android android-transitions

我有两个活动(A和B),当我点击一个按钮时,A中的元素开始动画过渡到B.但是,我想禁用从B回到A时向后播放的相同过渡。 / p>

在提出这个问题之前,我在互联网上进行了研究,发现有两种方法setSharedElementReturnTransition(transition)setSharedElementReenterTransition(transition)。这些方法在适当的onCreate()方法中使用transition = null进行调用,并且无法正常工作。

我找到的唯一解决方案是取消转换,在finish()而不是onBackPressed()中调用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>

2 个答案:

答案 0 :(得分:6)

更新支持库后,可以取消共享元素转换,而无需将super.onBackPressed();更改为finish();

只需要设置(在我的情况下)返回/重新进入过渡到null并更改视图上的过渡名称。

getWindow().setSharedElementReturnTransition(null); getWindow().setSharedElementReenterTransition(null); view.setTransitionName(null);

答案 1 :(得分:-1)

您可以使用以下代码获得所需的输出: 的 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
}

<强> OR

如果你想在启动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();
}