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

时间:2014-10-25 22:16:42

标签: android android-5.0-lollipop shared-element-transition activity-transition

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

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

  1. styles.xml
  2. 中启用了窗口内容转换
  3. 在我的风格
  4. 中引用了一个非常简单的slide.xml作为退出转换
  5. 为两个布局中的共享元素提供了android:transitionName
  6. 使用该名称和我想要分享的视图调用ActivityOptions.makeSceneTransitionAnimation()
  7. 将生成的包传递给startActivity()
  8. 这是我看到的行为(尝试慢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>
    

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

1 个答案:

答案 0 :(得分:11)

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

在错误中,您必须重新进入转换并重新转换共享元素。默认重新进入转换与两者的退出转换相同。

如果在返回转换期间,当视图仍在进入时,共享元素将被传输回调用Activity,则在中断返回调用时会看到打嗝。通过滑动和爆炸过渡,您还会看到下次退出时,它们将从打嗝发生的位置开始,这样您就可以获得一个很好的双击。

所以你有几个方法可以解决这个bug,直到MR1:

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