在使用动画的时候要注意: 系统原生的旋转和位置动画并没有真正改变view的位置
当二级菜单消失的时候,我们点击之前触发事件的位置,就会发现能够继续显示或隐藏三级菜单。如下图
我们在AnimUtil工具类中,当隐藏菜单后,将所有布局下面的子View禁用;当显示菜单的时候,将所有布局下的子View进行显示。完整代码如下:
public class AnimUtil {
/**
* 关闭按钮
*
* @param rl
* 操作的布局
* @param startOffset
* 动画延迟效果实现
*/
public static void closeMenu(RelativeLayout rl, int startOffset) {
// 获取RelativeLayout子View
for (int i = 0; i < rl.getChildCount(); i++) {
// 获取当前子View并禁用
rl.getChildAt(i).setEnabled(false);
}
// pivotXValue: 0-1
RotateAnimation animation = new RotateAnimation(0, -180,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 1);
animation.setDuration(500);
animation.setFillAfter(true);// 动画结束后保持当时的状态
animation.setStartOffset(startOffset); // 动画延迟
rl.startAnimation(animation);
}
/**
* 显示按钮
*
* @param rl
* 操作的布局
* @param startOffset
* 动画延迟效果实现
*/
public static void showMenu(RelativeLayout rl ) {
// 获取RelativeLayout子View
for (int i = 0; i < rl.getChildCount(); i++) {
// 获取当前子View并启用
rl.getChildAt(i).setEnabled(true);
}
RotateAnimation animation = new RotateAnimation(-180, 0,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 1);
animation.setDuration(500);
animation.setFillAfter(true);// 动画结束后保持当时的状态
rl.startAnimation(animation);
}
}
当点击home按钮的时候,二级菜单和三级菜单都需要消失,那么也需要将MainActivity里面的逻辑进行更改。
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv_home:
if (isShowLeve2) {
// 需要隐藏
int startOffset = 0;
if(isShowLeve3){
AnimUtil.closeMenu(leve3, startOffset);
startOffset += 300;
isShowLeve3 = false;
}
AnimUtil.closeMenu(leve2,startOffset);
} else {
// 需要显示
AnimUtil.showMenu(leve2);
}
isShowLeve2 = !isShowLeve2;
break;
case R.id.iv_menu:
if (isShowLeve3) {
//关闭三级菜单
AnimUtil.closeMenu(leve3, 0);
}else {
//显示三级菜单
AnimUtil.showMenu(leve3);
}
isShowLeve3 = !isShowLeve3;
break;
default:
break;
}
}