组合 Move Tranlation + Activity 过渡动画

Combining Move Tranlation + Activity Transition Animation

我想做的事情:

假设我在屏幕的右上角有一个 imageView。

一个。当我点击它时,它会 move/translate 到屏幕中心

乙。然后它应该使用 SharedElement Transition

动画化为新的 activity

我可以使用 LINK and B using LINK

做 A

2 个问题

  1. 我做的对吗

  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。