2015-02-07 94 views
13

比方說,我使用的是基於視圖的方法來開發例如像下面的文章中所描述的Android應用程序:所以現在http://corner.squareup.com/2014/10/advocating-against-android-fragments.html共享單元轉換次數(不活動或片段)之間

我有兩個完整的屏幕視圖。一個是可見的,包含一個圖像網格。另一個是隱藏的,並且是要被點擊的圖像的詳細視圖。如果沒有單擊網格中的圖像的過渡,網格視圖將被隱藏,並且將顯示詳細視圖。現在如果我想要有類似於網格視圖中的小圖像與詳細視圖中的較大圖像之間的共享元素轉換的東西。是這樣的可能嗎?

Image

+2

android.transition.Scene? – pskink 2015-02-07 20:22:14

回答

18

是,過渡允許這一點。

在您的示例中,您的層次結構中既有網格視圖又有詳細視圖。要使用轉換,如果詳細視圖不在View層次結構中啓動,它將會更好。你需要交換兩個觀點。

有兩種(類似)的方式來做到這一點。首先是在場景中顯示網格視圖。然後使用TransitionManager.go(detailScene,transition)。

第二種方法是使用TransitionManager.beginDelayedTransition,然後交換網格佈局的詳細布局。

讓共享視圖具有共同點很重要。通常它是一個視圖ID或transitionName。這個鏈接將告訴轉換系統,即使視圖是不同的實例。

您要使用的過渡是@android:transition/move。它結合了ChangBounds,ChangeTransform,ChangeImageTransform和ChangeClipBounds。您必須在共享元素視圖中將其作爲目標。看起來您需要進入和/或退出視圖的另一個轉換(淡入淡出?)。

事情是這樣的:

TransitionSet shared = ... 
shared.addTarget("sharedName"); 
gridElement.setTransitionName("sharedName"); 
Fade fade = new Fade(); 
fade.excludeTarget("sharedName", true); 
TransitionSet set = new TransitionSet(); 
set.addTransition(shared) 
    .addTransition(fade); 
TransitionManager.go(detailScene, set); 
+1

喬治,非常感謝你的回答!我已經使用你的方法創建了一個快速POC(https://github.com/eugenkiss/MaterialEverywhere/commit/53b6ddcd22f40e06b11a06b9c7613a1e8b13ffe5)。但是,如果您將基於視圖的(共享)轉換與原始基於活動的轉換進行比較,則會看到一些缺陷。例如,共享元素沒有在覆蓋圖上繪製,而是前一個場景是。您是否看到有可能改進這種方法,使其看起來(幾乎)完全像以前的基於活動的轉換? – Eugen 2015-02-08 11:42:57

+1

我有一些好消息和一些壞消息。好消息是我想出瞭如何讓你的應用程序轉換工作。壞消息是它有點詭異!淡入淡出轉換和ChangeTransform都將視圖添加到疊加層。我不相信這些補充的順序是有保證的。如果您將它們添加到集合中,它就會正常工作(先淡出然後共享)。 transitionName也被應用於錯誤的元素(imageView的容器),所以ChangeImageTransform無法在其上工作。 – 2015-02-09 15:58:42

+0

謝謝,它的作品(https://github.com/eugenkiss/MaterialEverywhere/commit/6599d6d42463710eb8422435ea7ef306360cf598)! – Eugen 2015-02-09 20:02:56