为了视图的显示与隐藏添加过度动画,下面是工具类
public class ViewAnimUtils {
// 显示动画
public static void showViewWithAnim(View view, long duration, int height) {
view.setVisibility(View.VISIBLE);
ValueAnimator valueAnimator = createDropAnimator(view, 0, height);
valueAnimator.setDuration(duration);
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "alpha", 0f, 1f);
objectAnimator.setDuration(duration);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(valueAnimator, objectAnimator);
animatorSet.start();
}
// 隐藏动画,最后一个参数为动画结束的接口回调
public static void hideViewWithAnim(View view, long duration, int height, @NonNull AnimationEnd animationEnd) {
ValueAnimator valueAnimator = createDropAnimator(view, height, 0);
valueAnimator.setDuration(duration);
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f);
objectAnimator.setDuration(duration);
objectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.GONE);
animationEnd.onAnimationEnd();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(valueAnimator, objectAnimator);
animatorSet.start();
}
// 创建高度增减的属性动画
private static ValueAnimator createDropAnimator(final View v, int start, int end) {
ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator arg0) {
int value = (int) arg0.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
layoutParams.height = value;
v.setLayoutParams(layoutParams);
}
});
return animator;
}
public interface AnimationEnd{
void onAnimationEnd();
}
}
如果显示或隐藏的这个view需要动态改变高度,那就直接显示或隐藏即可,不需要调用动画。