淡化过渡未按预期工作
Fade transitions not working as expected
我开始尝试使用 TransitionManager 和 Scenes 进行过渡。
我想做的是拥有 3 个任意的、完全不相关的布局,然后简单地将它们完全淡出然后淡入(不是交叉淡入淡出,只是顺序淡出和淡入)。
所以场景:A->B->C。 A 预填充在 activity 布局中,包含标签。
发生的事情是:
- 场景A淡出;
- 场景 B 淡入;
- 场景B消失,不褪色; (错误行为)
- 场景 C 淡入;
我过去在共享元素转换方面的经验让我相信这一切都与布局和适当的定位有关。因为这不是关于共享元素而是关于整个场景,所以我想定位所有布局元素,无论它们是什么以及它们的 ID 是什么。总之,下面是所有相关代码和 XMLs.
的完整列表
启动序列调用的方法:
@OnClick(R.id.transition_start)
protected void playSceneB(Button b) {
final Scene scene_b = Scene.getSceneForLayout(mSceneContainer, R.layout.scene_b, this);
final Transition transition = TransitionInflater.from(this)
.inflateTransition(R.transition.transition);
transition.addListener(mTransitionListener);
TransitionManager.go(scene_b, transition);
}
听众:
private Transition.TransitionListener mTransitionListener = new EndTransitionListener() {
@Override
public void onTransitionEnd(Transition transition) {
playSceneC();
}
@Override
public void onTransitionCancel(Transition transition) {
playSceneC();
}
};
场景C的启动方法
private void playSceneC() {
final Scene scene_c = Scene.getSceneForLayout(mSceneContainer, R.layout.scene_c, this);
final Transition transition = TransitionInflater.from(this)
.inflateTransition(R.transition.transition);
TransitionManager.go(scene_c, transition);
}
过渡(两个场景变化相同):
<?xml version="1.0" encoding="utf-8"?>
<transitionSet
xmlns:android="http://schemas.android.com/apk/res/android"
android:startDelay="4000"
android:transitionOrdering="sequential">
<fade
android:duration="2000"
android:fadingMode="fade_out"/>
<fade
android:duration="2000"
android:fadingMode="fade_in"/>
</transitionSet>
以及布局(布局 A 和 B 相同,只是在文本视图上设置了不同的字符串):
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/background"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/hello"/>
</FrameLayout>
</FrameLayout>
布局 C:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/background"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:src="@mipmap/ic_launcher"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:text="@string/hello3"/>
</LinearLayout>
</FrameLayout>
</FrameLayout>
注意。我希望它能在 KitKat 上运行。
编辑:我尝试使用 XML 和代码中的 AutoTransition 进行制作,但没有成功。还尝试通过手动调用 Scene.enter() 将其称为 TransitionManager.beginDelayedTransition,它的行为仍然相同。
Edit2:我已将侦听器添加到两个转换以记录回调。
- 07-31 09:18:57.490 4744-4744/com.test.transition
D/TransitionActivity: onTransitionStart
- 07-31 09:19:01.520 4744-4744/com.test.transition
D/TransitionActivity: onTransitionEnd
- 07-31 09:19:01.520 4744-4744/com.test.transition
D/TransitionActivity: onTransitionPause
- 07-31 09:19:01.520 4744-4744/com.test.transition
D/TransitionActivity: 第二次转换开始
- 07-31 09:19:03.530 4744-4744/com.test.transition
D/TransitionActivity: 第二次转换结束
请注意时间安排。 4 秒后第一次结束。第二次在开始后 2 秒结束(只是淡入,淡出被省略)
我可以建议使用 Transition.setStartDelay() 而不是 handler.postDelayed();
发布此信息以便潜在的观众将来可能会有所了解。
我成功了。当我从根视图组(带有 id=container 的视图组)中删除所有 ID 时,它开始工作。显然,在这种特殊情况下,过渡框架忽略了淡出这种布局的 children。
使用不同的 ID 也可以。
我开始尝试使用 TransitionManager 和 Scenes 进行过渡。 我想做的是拥有 3 个任意的、完全不相关的布局,然后简单地将它们完全淡出然后淡入(不是交叉淡入淡出,只是顺序淡出和淡入)。 所以场景:A->B->C。 A 预填充在 activity 布局中,包含标签。
发生的事情是:
- 场景A淡出;
- 场景 B 淡入;
- 场景B消失,不褪色; (错误行为)
- 场景 C 淡入;
我过去在共享元素转换方面的经验让我相信这一切都与布局和适当的定位有关。因为这不是关于共享元素而是关于整个场景,所以我想定位所有布局元素,无论它们是什么以及它们的 ID 是什么。总之,下面是所有相关代码和 XMLs.
的完整列表启动序列调用的方法:
@OnClick(R.id.transition_start)
protected void playSceneB(Button b) {
final Scene scene_b = Scene.getSceneForLayout(mSceneContainer, R.layout.scene_b, this);
final Transition transition = TransitionInflater.from(this)
.inflateTransition(R.transition.transition);
transition.addListener(mTransitionListener);
TransitionManager.go(scene_b, transition);
}
听众:
private Transition.TransitionListener mTransitionListener = new EndTransitionListener() {
@Override
public void onTransitionEnd(Transition transition) {
playSceneC();
}
@Override
public void onTransitionCancel(Transition transition) {
playSceneC();
}
};
场景C的启动方法
private void playSceneC() {
final Scene scene_c = Scene.getSceneForLayout(mSceneContainer, R.layout.scene_c, this);
final Transition transition = TransitionInflater.from(this)
.inflateTransition(R.transition.transition);
TransitionManager.go(scene_c, transition);
}
过渡(两个场景变化相同):
<?xml version="1.0" encoding="utf-8"?>
<transitionSet
xmlns:android="http://schemas.android.com/apk/res/android"
android:startDelay="4000"
android:transitionOrdering="sequential">
<fade
android:duration="2000"
android:fadingMode="fade_out"/>
<fade
android:duration="2000"
android:fadingMode="fade_in"/>
</transitionSet>
以及布局(布局 A 和 B 相同,只是在文本视图上设置了不同的字符串):
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/background"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/hello"/>
</FrameLayout>
</FrameLayout>
布局 C:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout android:id="@+id/container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/background"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<ImageView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:src="@mipmap/ic_launcher"/>
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:text="@string/hello3"/>
</LinearLayout>
</FrameLayout>
</FrameLayout>
注意。我希望它能在 KitKat 上运行。
编辑:我尝试使用 XML 和代码中的 AutoTransition 进行制作,但没有成功。还尝试通过手动调用 Scene.enter() 将其称为 TransitionManager.beginDelayedTransition,它的行为仍然相同。
Edit2:我已将侦听器添加到两个转换以记录回调。
- 07-31 09:18:57.490 4744-4744/com.test.transition D/TransitionActivity: onTransitionStart
- 07-31 09:19:01.520 4744-4744/com.test.transition D/TransitionActivity: onTransitionEnd
- 07-31 09:19:01.520 4744-4744/com.test.transition D/TransitionActivity: onTransitionPause
- 07-31 09:19:01.520 4744-4744/com.test.transition D/TransitionActivity: 第二次转换开始
- 07-31 09:19:03.530 4744-4744/com.test.transition D/TransitionActivity: 第二次转换结束
请注意时间安排。 4 秒后第一次结束。第二次在开始后 2 秒结束(只是淡入,淡出被省略)
我可以建议使用 Transition.setStartDelay() 而不是 handler.postDelayed();
发布此信息以便潜在的观众将来可能会有所了解。
我成功了。当我从根视图组(带有 id=container 的视图组)中删除所有 ID 时,它开始工作。显然,在这种特殊情况下,过渡框架忽略了淡出这种布局的 children。
使用不同的 ID 也可以。