渐变过渡不按预期工作

时间:2016-07-31 00:45:33

标签: android android-animation android-transitions

我开始尝试使用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上运行。

编辑:我尝试使用AutoTransition制作它,无论是来自XML还是代码,它都无法正常工作。还尝试将其称为TransitionManager.beginDelayedTransition,并手动调用Scene.enter(),它的行为仍然相同。

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持续时间后结束。开始后2秒结束2次(刚刚淡入,淡出被忽略)

2 个答案:

答案 0 :(得分:2)

发布这样的潜在观众可能会在将来有所暗示。

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

拥有不同的ID也可以。

答案 1 :(得分:0)

我建议使用Transition.setStartDelay()代替handler.postDelayed();