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

时间:2017-05-11 02:51:15

标签: java android android-constraintlayout

我正在尝试使用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;
}

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

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

实现类是ImageView的扩展,但ImageView的方法没有改变。

如何以动画方式将视图的大小增加到另一个视图的大小?

2 个答案:

答案 0 :(得分:3)

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

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

以下是输出。

enter image description here

答案 1 :(得分:0)

我还没有尝试过这个但是你可以尝试使用ScaleAnimation来代替ValueAnimator:

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

当然,如果它有效,你需要对宽度做同样的事情,因为scaleY你只是按比例缩放高度。

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