2016-07-31 25 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