前言
实现一种菜单,菜单从顶部弹入,然后从底部消失,顶部弹入时,有一个上下抖动的过程,底部消失时,先向上滑动,然后再向下滑动消失。
效果图如下:
引入依赖
implementation 'com.android.support:support-dynamic-animation:27.1.1'
创建SpringAnimation需要三个参数。
- 做动画的View
- 做动画的类型(DynamicAnimation)
ALPHA
ROTATION
ROTATION_X
ROTATION_Y
SCALE_X
SCALE_Y
SCROLL_X
SCROLL_Y
TRANSLATION_X
TRANSLATION_Y
TRANSLATION_Z
X
Y
Z
上边的gif图为DynamicAnimation为TRANSLATION_Y的预览图,现在我们把参数设置为ROTATION,
SpringAnimation signUpBtnAnimY = new SpringAnimation(constraintLayout, DynamicAnimation.ROTATION, 0);
效果图如下:
- 创建动画的最终位置
相对View的当前位置的偏移量。
SpringForce
为了让动画流畅,有弹簧的性质,需要设置SpringForce的相关参数。
- Stiffness
即刚度,此值越大,产生的里越大,动画中弹性效果越不明显,运动比较快。
STIFFNESS_HIGH
STIFFNESS_LOW
STIFFNESS_MEDIUM
STIFFNESS_VERY_LOW
设置方法为:
signUpBtnAnimY.getSpring().setStiffness(SpringForce.STIFFNESS_LOW);
- DampingRatio阻尼比
即阻尼比,此值越大,弹簧效果停止的越快
DAMPING_RATIO_HIGH_BOUNCY
DAMPING_RATIO_LOW_BOUNCY
DAMPING_RATIO_MEDIUM_BOUNCY
DAMPING_RATIO_NO_BOUNCY
设置方法为:
signUpBtnAnimY.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY);
StartVelocity
启动速度,默认速度为0,单位是px/second.
整体代码如下:
- 显示菜单动画
public void showAnimal() {
setVisibility(View.VISIBLE);
SpringAnimation signUpBtnAnimY = new SpringAnimation(constraintLayout, DynamicAnimation.TRANSLATION_Y, 0);
signUpBtnAnimY.getSpring().setStiffness(SpringForce.STIFFNESS_LOW);
signUpBtnAnimY.getSpring().setDampingRatio(SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY);
signUpBtnAnimY.setStartVelocity(5000);
signUpBtnAnimY.start();
}
- 隐藏菜单动画
public void hideAnimal() {
height = (ScreenTools.getScreenHeight(getContext()) - constraintLayout.getHeight()) / 2 + constraintLayout.getHeight() + ScreenTools.dp2px(getContext(),50);
ObjectAnimator animator = ObjectAnimator.ofFloat(constraintLayout, "translationY", 0f, -100f, height);
animator.setDuration(600);
animator.setInterpolator(new DecelerateInterpolator());
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
setVisibility(GONE);
reLayout();
}
});
animator.start();
}
源码: https://github.com/LSnumber1/...