2016-07-31 62 views
1

我开始尝试使用TransitionManager和场景进行转换。 我想要做的是有3个任意的,完全不相关的布局,并简单地淡出它们,然后淡入淡出(不是交叉淡入淡出,只是顺序淡出和淡入)。 So场景: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和代码,它没有工作。还尝试通过手动方式调用Scene.enter()将其作为TransitionManager.beginDelayedTransition调用,并且它的行为仍然相同。

编辑2:我已经添加了监听器到两个转换日志回调。

  • 九月7日至31日:18:57.490 4744-4744/com.test.transition d/TransitionActivity:onTransitionStart
  • 九月7日至31日:19:01.520 4744-4744/com.test.transition d/TransitionActivity:onTransitionEnd
  • 九月7日至31日:19:01.520 4744-4744/com.test.transition d/TransitionActivity:onTransitionPause
  • 九月7日至31日:19:01.520 4744-4744/com.test。转换 D/TransitionActivity:第2转换开始
  • 07-31 09:19:03.530 4744-4744/com.test。转换 D/TransitionActivity:第二转换结束

请注意时间。第一次结束后4秒。开始后2秒结束(刚刚淡入,淡出被忽略)

回答

2

发布此内容以便潜在观众在未来可能会有提示。

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

拥有不同的ID也有效。

0

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

+0

感谢您的意见。你说得对,这样更清洁,但是这并不能解决问题。 – mhenryk

+0

我编辑了代码示例以显示当前状态。 – mhenryk