Android学习(37) -- 自定义控件(2)解决旋转的bug

在Android开发中,遇到系统旋转动画并未实际改变View位置的问题,导致二级菜单在隐藏后,原先点击区域仍能触发三级菜单显示。通过在AnimUtil工具类中,控制隐藏和显示菜单时子View的状态来解决此bug。同时,更新MainActivity的逻辑,确保点击home按钮时,二级和三级菜单都能正确关闭。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用动画的时候要注意: 系统原生的旋转和位置动画并没有真正改变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;
		}
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值