1

我想做的事:

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

A. 当我点击它时,它会移动/平移到屏幕中心

B. 然后它应该使用 SharedElement Transition 动画成新的活动

我可以使用 LINK 做 A和使用 LINKB

2 个问题

  1. 我做得对吗

  2. 如何结合A和B

在乔治的回答之后

v21/主题.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);
4

1 回答 1

1

根据我在链接中读到的内容,您正在尝试直接使用 Animators 制作初始动画。可以通过使用 Animator Listener (onAnimationEnd) 来启动 Activity 来做到这一点,但我猜这不是你的想法。

“正确”的方法是使用 SharedElementExitTransition 在视图转换到新 Activity 之前移动视图。您可以使用 ChangeTransform 或 ChangeBounds 来移动它,具体取决于您修改的属性(平移或位置)。

本质上:

startActivity(intent, bundle);
moveImage();

这将导致共享元素的退出转换根据您在移动图像中所做的操作将其置于最终位置。当它完成时,启动的活动将使用它的共享元素进入转换将其移动到最终位置。

编辑:

如果您只是调整布局参数,您似乎需要强制父视图的布局。我还不确定为什么这是必要的。调用 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 的左/上/右/下。

于 2015-01-30T05:42:39.087 回答