我试图了解 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>