使用 ValueAnimator 将视图缩放到另一个视图的大小

Scale a view to another view's size using ValueAnimator

我正在尝试使用 ValueAnimator 调整一个视图的大小以适应另一个视图的大小。我正在使用它而不是动画,因为我需要之后可以点击视图。

private Animator getHeightScaleAnimator(View target) {
    ConstraintLayout.LayoutParams thisParams = (ConstraintLayout.LayoutParams) getLayoutParams();
    ConstraintLayout.LayoutParams targetParams = (ConstraintLayout.LayoutParams) target.getLayoutParams();

    int currentHeight = thisParams.height;
    int desiredHeight = targetParams.height;

    ValueAnimator animator = ValueAnimator.ofInt(currentHeight, desiredHeight);
    animator.addUpdateListener(animation -> {
        int newInt = (int) animation.getAnimatedValue();
        thisParams.width = newInt;
        invalidate();
        requestLayout();
    });
    return animator;
}

上面的代码显示了一种方法,在该方法中我尝试将视图的高度增加到所需的视图高度,我对宽度也有相同的方法,但使用的是宽度而不是高度。

期望的行为是视图增加其大小,直到它与目标视图一样大,但由于某些奇怪的原因,视图移动而不是调整大小。

实现 class 是 ImageView 的扩展,但 ImageView 中的方法没有更改。


我怎样才能以动画方式将视图的大小增加到另一个视图的大小?

我还没有尝试过,但是您可以尝试使用 ScaleAnimation 而不是 ValueAnimator:

float scaleY = (float) currentHeight / (float) desiredHeight;
curView.animate().scaleY(scaleY);

当然,如果它有效,您需要对宽度执行相同的操作,因为 scaleY您只是在放大高度。

此外,如果您想更改动画持续时间,您可以调用 .setDuration(1000)

只需在您的代码中添加以下方法即可。

private Animator getViewScaleAnimator(View from, final View target) {
        // height resize animation
        AnimatorSet animatorSet = new AnimatorSet();
        int desiredHeight = from.getHeight();
        int currentHeight = target.getHeight();
        ValueAnimator heightAnimator = ValueAnimator.ofInt(currentHeight, desiredHeight);
        heightAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) target.getLayoutParams();
                params.height = (int) animation.getAnimatedValue();
                target.setLayoutParams(params);
            }
        });
        animatorSet.play(heightAnimator);

        // width resize animation
        int desiredWidth = from.getWidth();
        int currentWidth = target.getWidth();
        ValueAnimator widthAnimator = ValueAnimator.ofInt(currentWidth, desiredWidth);
        widthAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) target.getLayoutParams();
                params.width = (int) animation.getAnimatedValue();
                target.setLayoutParams(params);
            }
        });
        animatorSet.play(widthAnimator);
        return animatorSet;
    }

并在任何事件中调用它。(例如点击)

getViewScaleAnimator(fromView, targetView).setDuration(1000).start();

这是一个输出。