我一直在搞乱 Android 5.0 中的新 API,并一直试图弄清楚是否可以在Activity 过渡ViewGroup
期间将 a 和它的一个子项分别作为共享元素设置动画。
下面的屏幕截图给出了我想要实现的简化示例:
在第一个活动中,深灰色框位于ViewGroup
屏幕中心,红色框为其子View
项(我使用的布局 XML 代码可以在此处找到)。当用户点击深灰色框时,深灰色框应逐渐放大以填充第二个活动的背景。同时,红框应逐渐缩放并重新定位在第二个活动的左上角。
活动和动画代码
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 上获得,并且可在此处下载可运行的 APK (您需要运行 Android 5.0 的物理设备或模拟器来运行 APK)。