活动中的打嗝与共享元素转换

我想要使​​用Android棒棒糖的新活动转换。 但是目前我在animation中看到很奇怪的混乱。 我把我能想到的最小样本一起砍了。

这是我在一个非常短的版本中做的:

  1. 在我的styles.xml启用了窗口内容转换
  2. 在我的风格中引用了一个非常简单的slide.xml作为退出转换
  3. 为这两个布局中的共享元素提供了android:transitionName
  4. 调用ActivityOptions.makeSceneTransitionAnimation()与该名称和我想要共享的视图
  5. 将生成的包传递给startActivity()

这是我看到的行为(尝试慢10倍的animation速度,以查看我的意思):就在幻灯片animation向下滑动不共享的视图之前,这些视图会稍微跳下来。 他们实际上有点分开。

但是:这只发生在我第二次运行该animation(以后每次)。 第一关看起来很好。 而且这也只会发生,如果我想与下一个活动共享一个元素。 一切工作正常,如果我不试图分享一个元素。

这是我的代码:

价值观/ styles.xml

 <resources> <style name="AppTheme" parent="android:Theme.Material.Light"> <!-- enable window content transitions --> <item name="android:windowContentTransitions">true</item> <!-- specify exit transition --> <item name="android:windowExitTransition">@transition/slide</item> </style> </resources> 

过渡/ slide.xml

 <slide /> 

主要活动的布局

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#0000ff" /> <View android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#00ff00" /> <View android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#0000ff" /> <View android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#00ff00" /> </LinearLayout> <!-- the actual element I want to share --> <View android:id="@+id/view" android:layout_width="56dp" android:layout_height="56dp" android:background="#ff0000" android:elevation="8dp" android:transitionName="view" /> </RelativeLayout> 

MainActivity.java

 public class MainActivity extends Activity implements View.OnClickListener { View mView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mView = findViewById(R.id.view); mView.setOnClickListener(this); } @Override public void onClick(View view) { ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, mView, "view"); Intent intent = new Intent(this, SecondaryActivity.class); startActivity(intent, options.toBundle()); } } 

Solutions Collecting From Web of "活动中的打嗝与共享元素转换"

有可能是因为某种原因,在L被locking之后才发现过渡库中存在一个错误。

在这个错误中,你必须有一个重新input转换和一个共享元素重新input转换。 默认重新input转换与两者的退出转换相同。

如果在返回转换过程中共享元素被转回到调用活动,而视图仍然进入,您将在中断返回呼叫时看到打嗝。 随着幻灯片和爆炸过渡,你也会看到下一次你离开的时候,他们会从发生呃逆的地方开始,所以你会得到一个很好的双重胜利。

所以你有几个选项来解决这个错误,直到MR1:

  • 显式设置android:windowSharedElementReenterTransition@null 。 大多数情况下,您不需要共享元素重新input转换,因为被调用的Activity会将共享元素放置在正确的位置。
  • 不要使用退出转换(将android:windowReenterTransition设置为@null
  • 确保调用Activity的持续时间android:windowSharedElementReturnTransition足够大,以便调用Activity的windowReenterTransition首先完成。 这可能是棘手的,因为它可以取决于设备状态 – 调用Activity可能已经从内存中删除,需要重新启动。
  • android:windowAllowReturnTransitionOverlap设置为false