gpt4 book ai didi

android - TransitionListener 是如何工作的?

转载 作者:太空狗 更新时间:2023-10-29 14:10:14 33 4
gpt4 key购买 nike

我试图了解 Lollipop 转换和 TransitionListener,因此我创建了 2 个简单的 Activity 。 Activity A和Activity B。Activity A启动acitvity B。

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

移动过渡如预期的那样流畅和精细。

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

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

感谢您提供任何有关它为何如此工作的帮助。

我添加了一些系统打印,这是进入 Activity 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

从 Activity 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

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

这是我的代码:

Activity A:

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());
}
});
}
}

Activity 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) {

}
});
}

布局 Activity 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>

布局 Activity 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>

最佳答案

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

关于android - TransitionListener 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29577206/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com