在共享元素中animation嵌套视图时出现毛刺活动转换?

我一直在使用Android 5.0中的新API,并试图找出在活动转换期间是否可以将ViewGroup及其子项之一作为共享元素单独进行animation处理。

下面的屏幕截图给出了我试图实现的一个简单示例:

首先活动的初始职位第二活动最终职位

在第一个活动中,深灰色框是一个以屏幕为中心的ViewGroup ,红色框是其子View (我使用的布局XML代码可以在这里find)。 当用户点击深灰色框时,深灰色框应逐渐放大以填充第二个活动的背景。 同时,红盒子应该逐渐缩放,重新定位在第二个活动的左上angular。

活动和animation代码

我用来执行转换的Activity代码很简单:

 /** FirstActivity.java */ public class FirstActivity extends Activity implements View.OnClickListener { private View mOuterBox, mInnerBox; @Override protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); getWindow().setSharedElementExitTransition(new ChangeBounds()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); mOuterBox = findViewById(R.id.outer_box); mInnerBox = findViewById(R.id.inner_box); mOuterBox.setOnClickListener(this); } @Override public void onClick(View v) { Pair<View, String> outerBox = Pair.create(mOuterBox, mOuterBox.getTransitionName()); Pair<View, String> innerBox = Pair.create(mInnerBox, mInnerBox.getTransitionName()); Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(this, outerBox, innerBox).toBundle(); startActivity(new Intent(this, SecondActivity.class), bundle); } } /** SecondActivity.java */ public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); getWindow().setSharedElementEnterTransition(new ChangeBounds()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } } 

问题

当我点击第一个活动中的深灰色框时,共享元素过渡开始,深灰色框很好地放大以填充第二个活动的背景。 然而,红色的盒子看起来根本没有animation。 一旦过渡开始,红框突然resize,并在灰盒甚至完成animation之前将其自身定位在第二活动的最终位置。

我的问题

是否可以将一个ViewGroup和一个/一些/所有的子视图单独设置为Activity转换中的共享元素? 如果是这样,我做错了什么,我该怎么做,以确保儿童的意见也是animation?

如果您在描述时遇到问题,那么可以在GitHubfind这个示例项目的完整源代码, 在这里可以下载一个可运行的APK(您将需要一个运行Android 5.0的物理设备或模拟器来运行APK)。

Solutions Collecting From Web of "在共享元素中animation嵌套视图时出现毛刺活动转换?"

是的,你可以分别转换一个组和它的内容。 但是你只是发现了一个将在L MR1中修复的bug。

看起来这在L.中不被很好的支持。我build议你在第二个Activity中创build共享元素的兄弟姐妹:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <View android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/dark_gray" android:transitionName="outer_box"/> <RelativeLayout android:id="@+id/outer_box" android:layout_width="match_parent" android:layout_height="match_parent"> <View android:id="@+id/inner_box" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginLeft="50dp" android:layout_marginTop="50dp" android:background="@color/red" android:transitionName="inner_box" /> </RelativeLayout> </FrameLayout>