【问题标题】:Canceling shared element transition取消共享元素转换
【发布时间】:2017-01-23 11:32:43
【问题描述】:

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

在问这个问题之前,我上网查了一下,发现有setSharedElementReturnTransition(transition)setSharedElementReenterTransition(transition)两种方法。这些方法在transition = null 的适当活动onCreate() 方法中被调用,但没有奏效。

我找到的唯一解决方案是取消转换,在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>

【问题讨论】:

  • 我也面临同样的问题,对我来说,我所做的是finish() in onBackPressed()
  • 请分享您的代码
  • @AJay 感谢您的回复。我已经这样做了,但这不是解决方案
  • @AtmanBhatt 我更新了问题

标签: android android-transitions


【解决方案1】:

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

您只需将(在我的情况下)返回/重新输入转换为 null 并更改视图上的转换名称。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • overridePendingTransition 不是过渡框架的一部分,也与 OP 的问题所涉及的共享元素过渡无关
    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多