组合 Move Tranlation + Activity 过渡动画
Combining Move Tranlation + Activity Transition Animation
我想做的事情:
假设我在屏幕的右上角有一个 imageView。
一个。当我点击它时,它会 move/translate 到屏幕中心
乙。然后它应该使用 SharedElement Transition
动画化为新的 activity
我可以使用 LINK and B using LINK
做 A
2 个问题
我做的对吗
如何组合A和B
乔治回答后
v21/themes.xml
<resources>
<style name="AppTheme" parent="AppTheme.Base">
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowSharedElementExitTransition">@transition/exit_slide_transition</item>
<item name="android:windowSharedElementEnterTransition">@transition/enter_transition</item>
</style>
</resources>
exit_slide_transition.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeBounds
android:duration="1000"
android:interpolator="@android:anim/linear_interpolator"/>
</transitionSet>
linear.xml (被AnimationUtils.loadAnimation使用)
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">
<translate
android:fromYDelta="0"
android:toYDelta="45%p"
android:fromXDelta="0"
android:toXDelta="45%p"
android:duration="1000"/>
</set>
enter_transition.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeImageTransform/>
</transitionSet>
开始Activity + moveImage():
//StartActivity:
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(
activity, transitionView, EXTRA_IMAGE);
Intent intent = new Intent(activity, DetailActivity.class);
intent.putExtra(EXTRA_IMAGE, url);
ActivityCompat.startActivity(activity, intent, options.toBundle());
//moveImage():
RelativeLayout.LayoutParams layoutParams=new RelativeLayout.LayoutParams((int)getResources().getDimension(R.dimen.my_image_dp),(int)getResources().getDimension(R.dimen.my_image_dp));
layoutParams.addRule(RelativeLayout.CENTER_VERTICAL,RelativeLayout.TRUE);
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE);
imageView.setLayoutParams(layoutParams);
根据我在链接中看到的内容,您正在尝试直接使用 Animators 制作初始动画。可以通过使用 Animator Listener (onAnimationEnd) 启动 Activity 来做到这一点,但我猜这不是您的想法。
"correct" 方法是使用 SharedElementExitTransition 在视图转换到新的 Activity 之前移动视图。您可以使用 ChangeTransform 或 ChangeBounds 来移动它,具体取决于您修改的属性(翻译或位置)。
本质上:
startActivity(intent, bundle);
moveImage();
这将导致共享元素的退出过渡到 运行,具体取决于您在移动图像中将其置于最终位置的操作。完成后,启动的 activity 将使用它的共享元素将其移动到最终位置 enter transition。
编辑:
如果您只是调整布局参数,看起来您需要强制父视图的布局。我还不确定为什么这是必要的。调用 setLayoutParams 后,添加:
View parent = (View) imageView.getParent();
int widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY);
int heightSpec = View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.EXACTLY);
parent.measure(widthSpec, heightSpec);
parent.layout(parent.getLeft(), parent.getTop(), parent.getRight(), parent.getBottom());
您也可以直接更改 ImageView 的 left/top/right/bottom。
我想做的事情:
假设我在屏幕的右上角有一个 imageView。
一个。当我点击它时,它会 move/translate 到屏幕中心
乙。然后它应该使用 SharedElement Transition
动画化为新的 activity我可以使用 LINK and B using LINK
做 A2 个问题
我做的对吗
如何组合A和B
乔治回答后
v21/themes.xml
<resources>
<style name="AppTheme" parent="AppTheme.Base">
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowSharedElementExitTransition">@transition/exit_slide_transition</item>
<item name="android:windowSharedElementEnterTransition">@transition/enter_transition</item>
</style>
</resources>
exit_slide_transition.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeBounds
android:duration="1000"
android:interpolator="@android:anim/linear_interpolator"/>
</transitionSet>
linear.xml (被AnimationUtils.loadAnimation使用)
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">
<translate
android:fromYDelta="0"
android:toYDelta="45%p"
android:fromXDelta="0"
android:toXDelta="45%p"
android:duration="1000"/>
</set>
enter_transition.xml
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeImageTransform/>
</transitionSet>
开始Activity + moveImage():
//StartActivity:
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(
activity, transitionView, EXTRA_IMAGE);
Intent intent = new Intent(activity, DetailActivity.class);
intent.putExtra(EXTRA_IMAGE, url);
ActivityCompat.startActivity(activity, intent, options.toBundle());
//moveImage():
RelativeLayout.LayoutParams layoutParams=new RelativeLayout.LayoutParams((int)getResources().getDimension(R.dimen.my_image_dp),(int)getResources().getDimension(R.dimen.my_image_dp));
layoutParams.addRule(RelativeLayout.CENTER_VERTICAL,RelativeLayout.TRUE);
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE);
imageView.setLayoutParams(layoutParams);
根据我在链接中看到的内容,您正在尝试直接使用 Animators 制作初始动画。可以通过使用 Animator Listener (onAnimationEnd) 启动 Activity 来做到这一点,但我猜这不是您的想法。
"correct" 方法是使用 SharedElementExitTransition 在视图转换到新的 Activity 之前移动视图。您可以使用 ChangeTransform 或 ChangeBounds 来移动它,具体取决于您修改的属性(翻译或位置)。
本质上:
startActivity(intent, bundle);
moveImage();
这将导致共享元素的退出过渡到 运行,具体取决于您在移动图像中将其置于最终位置的操作。完成后,启动的 activity 将使用它的共享元素将其移动到最终位置 enter transition。
编辑:
如果您只是调整布局参数,看起来您需要强制父视图的布局。我还不确定为什么这是必要的。调用 setLayoutParams 后,添加:
View parent = (View) imageView.getParent();
int widthSpec = View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY);
int heightSpec = View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.EXACTLY);
parent.measure(widthSpec, heightSpec);
parent.layout(parent.getLeft(), parent.getTop(), parent.getRight(), parent.getBottom());
您也可以直接更改 ImageView 的 left/top/right/bottom。