我一直在搞乱Android 5.0中的新API,并一直试图弄清楚是否有可能在ViewGroup
和其中一个孩子分别作为共享元素动画显示{ {3}}
下面的屏幕截图给出了我想要实现的目标的简化示例:
在第一个活动中,深灰色框是屏幕中心的ViewGroup
,红色框是其子View
(我正在使用的布局XML代码{{3} })。当用户点击深灰色框时,深灰色框应逐渐向上扩展以填充第二个活动的背景。同时,红色框应逐渐缩放并重新定位在第二个活动的左上角。
我用来执行转换的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
转换中的共享元素?如果是这样,我做错了什么,我该怎么做才能确保儿童观点也有动画?
如果您无法按照我的说明操作,那么此示例项目的完整源代码可在Activity transition上获得,并且可运行的APK可供下载here(您需要物理设备或模拟器)运行Android 5.0来运行APK。。
答案 0 :(得分:5)
是的,您可以单独转换组及其内容。但是您刚刚发现了一个将在L MR1中修复的错误。
看来这在L中得不到很好的支持。我建议您在第二个Activity中创建共享元素兄弟:
<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>