15

我想動畫一個ImageView到Android API級別21兩個活動之間的另一個位置。由於Android L預覽中的「MoveImage」已被刪除,我使用「ChangeImageTransform」相反,但文檔中的示例代碼不起作用(兩個圖像分別爲動畫)。使用共享元素轉換與ChangeImageTransform兩個活動之間的動畫ImageView

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeImageTransform> 
     <targets> 
      <target android:targetId="@id/ivA" /> 
      <target android:targetId="@id/ivB" /> 
     </targets> 
    </changeImageTransform> 
</transitionSet> 

有沒有工作的例子?謝謝!

回答

28

爲了有一個共享的元素, 您可以閱讀this article並按照提到的步驟兩項活動之間的屏幕過渡動畫:

  1. 在主題啓用窗口內容的轉變。
  2. 在您的風格中指定共享元素轉換。
  3. 將轉換定義爲XML資源。
  4. 使用android:transitionName屬性爲兩個佈局中的共享元素分配一個公用名稱。
  5. 使用ActivityOptions.makeSceneTransitionAnimation()方法。

關於第三步驟中,根據documentation

與ChangeBounds組合,ChangeImageTransform允許改變尺寸,形狀,或ImageView.ScaleType順利動畫內容ImageViews。

的RE /轉換/ your_transition.xml應該是這樣的:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeBounds> 
     <targets> 
      <target android:targetId="@id/ivA" /> 
      <target android:targetId="@id/ivB" /> 
     </targets> 
    </changeBounds> 
    <changeImageTransform> 
     <targets> 
      <target android:targetId="@id/ivA" /> 
      <target android:targetId="@id/ivB" /> 
     </targets> 
    </changeImageTransform> 
</transitionSet> 

或者乾脆像這樣如果只IVA和IVB需要進行動畫:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeBounds/> 
    <changeImageTransform/> 
</transitionSet> 
+0

它現在有效,謝謝! – iForests 2014-10-28 03:54:20

+1

我一直試圖讓這個工作,但新活動的輸入轉換淡入與ImageView是舊活動中顯示的最後一件事。退出過渡雖然工作。 – 2014-12-30 19:42:39

+0

@TimmahhTimmahh您是否遵循文檔中的所有步驟?請提供更多信息,謝謝:) – 2014-12-31 11:31:46

8

我有本工作遵循本指南,其他一些內容以及參考資料。

以這種風格設置的過渡。我把它放在res/transition:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeBounds> 
     <targets> 
      <target android:targetId="@id/ivA" /> 
      <target android:targetId="@id/ivB" /> 
     </targets> 
    </changeBounds> 
    <changeImageTransform> 
     <targets> 
      <target android:targetId="@id/ivA" /> 
      <target android:targetId="@id/ivB" /> 
     </targets> 
    </changeImageTransform> 
</transitionSet> 

在源和目標ImageViews中,您需要添加一個名稱標記。名稱必須相同。

<ImageView 
... 
android:transitionName="MYTRANSITIONVIEW" 

/> 

在styles.xml,添加到應用程序的主題:

<item name="android:windowContentTransitions">true</item> 
<item name="android:windowActivityTransitions">true</item> 
<item name="android:windowSharedElementEnterTransition">@transition/my_transition</item> 
<item name="android:windowSharedElementExitTransition">@transition/my_transition</item> 

我一個片段中運行這個,所以我開始新的活動是這樣的:

Bundle bundle = null; 

if (activity != null) { 
    ActivityOptionsCompat options = 
       ActivityOptionsCompat.makeSceneTransitionAnimation(activity, Frag2_, "MYTRANSITIONVIEW"); 
    bundle = options.toBundle(); 
} 
activity.startActivity(i, bundle); 

它的工作原理在API 21客戶端上。它不適用於API 16客戶端,因爲XML標記無效。

我希望這會有所幫助。

輕微的更新,以獲得在退出逆轉移,我不得不打電話

supportFinishAfterTransition(); 

,而不是結束();

+0

它不應該是res/transitions,它應該是res/transition :) – 2016-01-08 19:53:11

+0

當然你是對的。謝謝! – formica 2016-01-09 16:30:47

+0

@formica它是否在API級別19工作? – Pei 2017-08-07 14:44:02