2015-02-07 95 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