使用 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();
这是一个输出。
我正在尝试使用 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();
这是一个输出。