做项目的时候有一个需求,Activity的底部有一个类似抽屉的菜单,点击把手展开活着收起
/**
*
* @param view 响应动画的View
* @param isInOrOut 是否是自下向上
*/
public static void bottomInAnimation(final View view, final boolean isInOrOut) {
if (view == null) {
return;
}
//这里四个参数分别表示 1、动画初始时View的X坐标与实际坐标的差值
//2、动画结束时View的X坐标与实际坐标的差值
//3、动画初始时View的Y坐标与实际坐标的差值
//4、动画结束时View的Y坐标与实际坐标的差值
//如果是从底部向上话则为负值
final int deltaLength = isInOrOut ? -view.getHeight() : view.getHeight();;
Animation translateAnimation = new TranslateAnimation(0, 0, 0, deltaLength);
//动画持续时间
translateAnimation.setDuration(300);
//是否停留在最后一帧,配合setFillEnabled(true)来用,否则失效。
translateAnimation.setFillAfter(true);
translateAnimation.setFillEnabled(true);
// 显示弹力
translateAnimation.setInterpolator(new OvershootInterpolator(0.6f));
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
// 由于动画其实相当于View移动的一个快照, 真正的View坐标时没有变化的, 而我们实际项目中view移动后可能要进行一些事件
// 中view移动后可能要进行一些事件处理,由于坐标没有变化,即使我门点击了某些View也不会有事件响应,所以进行如下操作
int t = view.getTop() + deltaLength;
int b = view.getBottom() + deltaLength;
view.layout(view.getLeft(), t, view.getRight(), b);
view.clearAnimation();
// 但是这时候我们会发现还是有些问题view移动后会发生些变化,这时候就需要我们利用view的LayoutParam设置起margin来实现我们想要的结果
// 比如当我们滑向底部时设置一下 比如View父View是RelativeLayout时
RelativeLayout.LayoutParams params = (LayoutParams) view.getLayoutParams();
params.bottomMargin = isInOrOut ? 0 : view.getHeight();
}
});
view.startAnimation(translateAnimation);
}
上面简单的说了一下代码的大概, 如果要实现更复杂的 比如支付宝客户端的底部栏上滑隐藏下滑显示则需要监听View的OnTouch事件监听其滑动了,如果是ListView 或者ScrollView 则在其onScroll中进行处理就好。