4

我试图了解 Lollipop 过渡和 TransitionListener,所以我创建了 2 个简单的活动。活动 A 和活动 B。活动 A 启动活动 B。

活动 A 在页面底部有一个绿色的小框。活动 B 在页面顶部有一个大的绿色框

移动过渡按预期顺利进行。

在 Activity BI 中,为 SharedElementEnterTransition 和 SharedElementReturnTransition 添加了 TransitionListener。

我的期望是,当进入活动 B 时,“进入侦听器”的 onTransitionStart 和 onTransitionEnd 应执行,当从 Activity B 返回时,“返回侦听器”的 onTransitionStart 和 onTransitionEnd 应执行。但事实并非如此,两个监听器在进入和返回时都会执行。

任何关于它为什么会这样工作的帮助表示赞赏。

我添加了一些系统打印,这是进入活动 B 时打印的内容:

12:59:22.686 #¤ ActivityB.onTransitionStart - Enter
12:59:22.686 #¤ ActivityB.onTransitionStart - Return
12:59:23.000 #¤ ActivityB.onTransitionEnd - Enter
12:59:23.000 #¤ ActivityB.onTransitionEnd - Return

从活动 B 返回时打印:

13:01:27.584 #¤ ActivityB.onTransitionStart - Enter
13:01:27.584 #¤ ActivityB.onTransitionStart - Return
13:01:27.894 #¤ ActivityB.onTransitionEnd - Enter
13:01:27.894 #¤ ActivityB.onTransitionEnd - Return

我的期望是在进入活动 A 时只打印“Enter”,从活动 B 返回时只打印“Return”。

这是我的代码:

活动一:

public class ActivityA extends Activity {

    private Activity mActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);

        mActivity = this;

        final View greenBox = findViewById(R.id.green_box_bottom);
        greenBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(mActivity, ActivityB.class);
                ActivityOptions options = ActivityOptions
                        .makeSceneTransitionAnimation(mActivity, greenBox, "move-green-box");

                startActivity(intent, options.toBundle());
            }
        });
    }
}

活动 B:

public class ActivityB extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);

        getWindow().getSharedElementEnterTransition().addListener(new Transition.TransitionListener() {
            @Override
            public void onTransitionStart(Transition transition) {
                System.out.println("#¤ ActivityB.onTransitionStart - Enter");
            }

            @Override
            public void onTransitionEnd(Transition transition) {
                System.out.println("#¤ ActivityB.onTransitionEnd - Enter");
            }

            @Override
            public void onTransitionCancel(Transition transition) {

            }

            @Override
            public void onTransitionPause(Transition transition) {

            }

            @Override
            public void onTransitionResume(Transition transition) {

            }
        });

        getWindow().getSharedElementReturnTransition().addListener(new Transition.TransitionListener() {
            @Override
            public void onTransitionStart(Transition transition) {
                System.out.println("#¤ ActivityB.onTransitionStart - Return");
            }

            @Override
            public void onTransitionEnd(Transition transition) {
                System.out.println("#¤ ActivityB.onTransitionEnd - Return");
            }

            @Override
            public void onTransitionCancel(Transition transition) {

            }

            @Override
            public void onTransitionPause(Transition transition) {

            }

            @Override
            public void onTransitionResume(Transition transition) {

            }
        });
    }

布局活动 A:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".ActivityA">

<View
    android:id="@+id/green_box_bottom"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="@android:color/holo_green_light"
    android:layout_alignParentBottom="true"
    android:transitionName="move-green-box"/>
</RelativeLayout>

布局活动 B:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".ActivityB">

<View
    android:id="@+id/green_box_bottom"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="@android:color/holo_green_light"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:transitionName="move-green-box"/>
</RelativeLayout>
4

1 回答 1

1

如果您未设置 ReturnTransition,则 Enter 转换将用作 ReturnTransition。所以你本质上是在同一个转换上设置两个监听器。尝试为 ReturnTransition 设置不同的过渡,看看是否不能解决问题。

于 2015-04-13T14:37:33.737 回答