在我的应用程序中尝试在一个活动的listview名称和下一个活动中的工具栏标题之间实现共享元素转换。我面临的问题是共享元素没有动画,因为它应该是动画以及整个布局的进入和退出过渡。
此处保险文本应与整个动画分开制作动画。
调用活动动画如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setSharedElementReturnTransition(TransitionInflater.from(this)
.inflateTransition(R.transition.trans_move));
// getWindow().setSharedElementExitTransition(new TransitionSet()
// .addTransition(new Fade()));
Slide slideTransition = new Slide();
slideTransition.setSlideEdge(Gravity.LEFT);
slideTransition.setDuration(getResources().getInteger(R.integer.anim_duration_long));
getWindow().setReenterTransition(slideTransition);
getWindow().setExitTransition(slideTransition);
}
setShareElementExitTransition对转换没有影响,因此将其注释掉
用于启动第二项活动的意图
ActivityOptionsCompat activityOptions
= ActivityOptionsCompat.makeSceneTransitionAnimation(
HomeActivity.this,
new Pair<>(view.findViewById(R.id.nameTextView),
SharedCertificatesActivity.ab_title)
);
Intent _intent=new Intent(mContext, SharedCertificatesActivity.class);
ActivityCompat.startActivity(HomeActivity.this,
_intent, activityOptions.toBundle());
第二个活动有以下场景转换
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// Re-enter transition is executed when returning to this activity
Slide slideTransition = new Slide();
slideTransition.setSlideEdge(Gravity.LEFT);
slideTransition.setDuration(getResources().getInteger(R.integer.anim_duration_medium));
Slide slideRightTransition = new Slide();
slideRightTransition.setSlideEdge(Gravity.RIGHT);
slideRightTransition.setDuration(getResources().getInteger(R.integer.anim_duration_medium));
// getWindow().setAllowReturnTransitionOverlap(true);
getWindow().setReenterTransition(slideRightTransition);
getWindow().setExitTransition(slideTransition);
// getWindow().setSharedElementEnterTransition(TransitionInflater.from(this)
// .inflateTransition(R.transition.trans_move));
ViewCompat.setTransitionName(title, ab_title);
}
我在SO上也发现了一个类似的问题here,但那里提到的解决方案对我没用。 如果上面的问题那么第二个活动的布局如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@color/primary"
app:popupTheme="@style/AppTheme.PopupOverlay">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|start"
android:fontFamily="sans-serif-medium"
android:text="Binder Name"
android:textColor="@color/_kAppearanceUINavigationBarTextColor"
android:textSize="20sp" />
</android.support.v7.widget.Toolbar>
<include layout="@layout/binder" />
</LinearLayout>
.
.
.
</android.support.design.widget.CoordinatorLayout>
任何帮助都将受到高度赞赏
答案 0 :(得分:0)
解决了这个问题 问题主要是由于动画时间问题。与其他窗口动画相比,共享元素的动画效果更快(默认值)。更改了第二个活动中的setupWindowAnimations方法,如下所示
private void setupWindowAnimations() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Slide slideTransition = new Slide();
slideTransition.setSlideEdge(Gravity.LEFT);
slideTransition.setInterpolator(new DecelerateInterpolator());
slideTransition.setDuration(460);
Slide slideRightTransition = new Slide();
slideRightTransition.setSlideEdge(Gravity.RIGHT);
slideRightTransition.setDuration(getResources().getInteger(R.integer.anim_duration_long));
getWindow().setReenterTransition(slideRightTransition);
getWindow().setExitTransition(slideTransition);
getWindow().setEnterTransition(slideTransition);
getWindow().setSharedElementEnterTransition(new ChangeBounds().setDuration(450));
getWindow().setSharedElementReturnTransition(null);
ViewCompat.setTransitionName(title, ab_title);
ViewCompat.setTransitionName(menu1, fab_anim);
}
}
现在更顺畅,共享元素按预期结果转换。信用转到guides.codepath.com和George Mount blog以清除有关共享元素转换的更多信息。
注意:谷歌bug用于将共享元素textview返回给调用活动,该活动直到日期尚未解决。所以必须禁用来自调用活动的共享元素返回转换。