结合移动翻译+活动过渡动画

时间:2015-01-30 00:26:02

标签: android android-animation translate-animation activity-transition

我想做什么:

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

一个。当我点击它时,它将移动/平移到屏幕的中心

B中。然后应使用SharedElement Transition

为新活动设置动画

我可以使用LINK和B使用LINK

进行A.

2个问题

  1. 我做得对吗

  2. 如何组合A和B

  3. 乔治回答后

    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);
    

1 个答案:

答案 0 :(得分: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的左/上/右/下。