我正在尝试使用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的方法没有改变。
如何以动画方式将视图的大小增加到另一个视图的大小?
答案 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();
以下是输出。
答案 1 :(得分:0)
我还没有尝试过这个但是你可以尝试使用ScaleAnimation来代替ValueAnimator:
float scaleY = (float) currentHeight / (float) desiredHeight;
curView.animate().scaleY(scaleY);
当然,如果它有效,你需要对宽度做同样的事情,因为scaleY
你只是按比例缩放高度。
此外,如果您想更改动画持续时间,可以致电.setDuration(1000)
。