使用共享元素在活动过渡中打嗝

Bjö*_*ing 7 android android-5.0-lollipop activity-transition shared-element-transition

我想使用Android Lollipop的新Activity Transitions.但目前我在动画片中看到非常奇怪的拾音.我把我能想到的最小样本砍在一起.

这是我在很短的版本中所做的:

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

这是我看到的行为(尝试慢10倍的动画速度来看看我的意思):在幻灯片动画向下滑动未共享的视图之前,这些视图会略微下降.他们实际上分开了一点.

但是:这只会在我第二次运行该动画时发生(之后每次都会发生).第一关看起来很好.而且只有当我想与下一个活动共享元素时才会发生这种情况.如果我不尝试共享元素,一切正常.

这是我的代码:

价值观/ 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>
Run Code Online (Sandbox Code Playgroud)

过渡/ slide.xml

<slide />
Run Code Online (Sandbox Code Playgroud)

主要活动的布局

<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>
Run Code Online (Sandbox Code Playgroud)

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());
    }


}
Run Code Online (Sandbox Code Playgroud)

Geo*_*unt 11

您可能会遇到转换库中的错误,由于某种原因,直到L被锁定后才会发现该错误.

在错误中,您必须具有重新转换和共享元素重新转换.默认重新导入转换与两者的退出转换相同.

如果在返回转换期间,共享元素在视图仍在进入时被转移回调用Activity,则在中断返回调用时会看到打嗝.通过滑动和爆炸过渡,您还会看到下次退出时,它们将从打嗝发生的地方开始,因此您可以获得一个漂亮的双重wammy.

所以你有几个选择来解决这个bug,直到MR1:

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

  • @BjörnHurling现在MR1已经出局了,我很好奇你是否仍然在v5.1 Lollipop设备上运行转换时遇到同样的问题.让我知道. (2认同)