我一直在摆弄 Android 5.0 中的新 API,并一直在尝试弄清楚是否可以同时为ViewGroup
及其子元素之一在一次操作期间分别作为共享元素活动转换.
下面的屏幕截图给出了我想要实现的目标的简化示例:
在第一个活动中,深灰色框是ViewGroup
位于屏幕中央,红色框是它的子项View
(我正在使用的布局XML代码可以找到here)。当用户单击深灰色框时,深灰色框应逐渐放大以填充第二个活动的背景。同时,红色框应逐渐缩放并重新定位在第二个活动的左上角。
活动和动画代码
The 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);
}
}
问题
当我单击第一个活动中的深灰色框时,共享元素转换开始,并且深灰色框很好地放大以填充第二个活动的背景。然而,红色框似乎根本没有动画。一旦过渡开始,在灰色框甚至完成动画之前,红色框会突然调整大小并将其自身定位到第二个活动中的最终位置。
我的问题
是否可以同时制作动画ViewGroup
并且它的一个/一些/所有子元素独立地视为一个共享元素Activity
过渡?如果是这样,我做错了什么,我能做些什么来确保孩子们的视图也被动画化?
如果您在理解我的描述时遇到困难,可以在以下位置找到此示例项目的完整源代码GitHub并且可以下载可运行的APKhere(您需要运行 Android 5.0 的物理设备或模拟器才能运行 APK)。