我正在尝试使用 ValueAnimator 调整一个 View 的大小以适应另一个 View 的大小。我使用它而不是动画,因为我需要 View 在之后可以点击。
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;
}
上面的代码显示了一种方法,在该方法中我尝试将 View 的高度增加到所需的 View 高度,并且我对宽度有相同的方法,但使用的是宽度而不是高度。
期望的行为是 View 增加其大小,直到它与目标 View 一样大,但由于某些奇怪的原因, View 移动而不是调整大小。
实现类是ImageView的扩展,但ImageView的方法没有改变。
我可以做些什么来以动画方式将一个 View 的大小增加到另一个 View 的大小?
只需在您的代码中添加以下方法。
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();
这是一个输出。
我是一名优秀的程序员,十分优秀!