【问题标题】:Fade transitions not working as expected淡入淡出过渡未按预期工作
【发布时间】:2016-07-31 00:45:32
【问题描述】:

我开始尝试使用 TransitionManager 和 Scenes 进行转换。 我想要做的是拥有 3 个任意、完全不相关的布局,然后将它们完全淡出然后淡入(不是交叉淡入,只是顺序淡出和淡入)。 所以场景:A->B->C。 A 在活动布局上预填充了包含标签。

会发生什么:

  • 场景 A 淡出;
  • 场景 B 淡入;
  • 场景 B 消失且不褪色; (错误行为)
  • 场景 C 淡入;

我过去在共享元素转换方面的经验让我相信这完全与布局和正确定位有关。由于这不是关于共享元素而是整个场景,我想定位所有布局元素,无论它们是什么以及它们的 ID 是什么。无论如何,下面是所有相关代码和 XML 的完整列表。

启动序列所调用的方法:

@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是一样的,只是在textview上设置了不同的字符串):

<?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:第二个过渡结束

请注意时间。第一次在 4s 持续时间后结束。 2nd 在开始后 2 秒结束(只是淡入,淡出被省略)

【问题讨论】:

    标签: android android-animation android-transitions


    【解决方案1】:

    发布此内容是为了让潜在的观众在未来有所了解。

    我让它工作了。当我从根视图组(具有 id=container 的)中删除所有 ID 时,它开始工作。显然,在这种特殊情况下,过渡框架忽略了淡出此布局的子项。

    使用不同的 ID 也可以。

    【讨论】:

      【解决方案2】:

      我可以建议使用Transition.setStartDelay() 而不是 handler.postDelayed();

      【讨论】:

      • 感谢您的意见。你是对的,这样更干净,但这并不能解决问题。
      • 我已经编辑了代码示例以显示当前状态。
      猜你喜欢
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多