android中关于位移动画TranslateAnimation开始和结束时闪动问题的记录

在Android中,使用TranslateAnimation可能导致动画开始或结束时的界面闪动。通过分析,发现setFillAfter(true)可以保持动画结束状态,但开始和结束时的处理可能引起问题。动画开始时,由于布局或子控件状态的改变,可能会触发onAnimationStart()回调两次,导致闪动。修正方法是确保先设置动画再改变布局状态,避免这种异常行为。

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

    大家都知道,android下动画效果如果想在动画结束的时候就停留在最后一帧画面上,则可以使用 Animation的setFillAfter(true) 来设置一下。但是在实际应用中我们往往会在动画开始或结束时做一些操作,当所做的操作是改变开启动画控件的布局或子控件的显隐状态时,如果处理不当往往会出现闪动问题,下面就我在项目中用到的位移动画分别来分析开始和结束时闪动的问题

1、动画开始时界面闪动问题:

//展开录音布局
	private void voiceLayoutUnfold() {
		//隐藏软键盘
		hideSoftInput();
		mAnimView.clearAnimation();
		final TranslateAnimation animation = new TranslateAnimation(0, 0, DeviceUtil.getDensity(getContext()) * 260, 0);
		animation.setDuration(500);
		mAnimView.setAnimation(animation);
         mAnimView.postDelayed(new Runnable() {
			@Override
			public void run() {
				childView.setVisibility(View.VISIBLE);
				animation.start();
			}
		}, 100);
	}

上面代码乍看之下并没有什么问题,调用了mAnimView.clearAnimation()方法清理了原有的动画,然后将位移动画设置给了mAnimView,由于是从底部向上弹出的,如果直接执行动画,软键盘还没来及收回的话会直接从软键盘的顶部开始执行动画,所以给了一个延时时间才开始显示子布局并开始执行动画。但是经调试发现执行childView.setVisibility(View.VISIBLE)时会引起界面闪动,添加log日志发现这段代码竟然会导致动画的onAnimationStart()回调方法执行两次。最后经调试发现是因为先绑定动画事件,再改变布局引起的,即先调用mAnimView.setAnimation(animation),后调用 childView.setVisibility(View.VISIBLE) 引起的,更正后的代码就不会出现界面闪动的问题了:

//展开录音布局
	private void voiceLayoutUnfold() {
		//隐藏软键盘
		hideSoftInput();
		final TranslateAnimation animation = new TranslateAnimation(0, 0, DeviceUtil.getDensity(getContext()) * 260, 0);
		animation.setDuration(500);
		
		mAinimView.postDelayed(new Runnable() {
			@Override
			public void run() {
				mAnimView.clearAnimation();
				childView.setVisibility(View.VISIBLE);
				CommentPublishView.this.setAnimation(animation);
				animation.start();
			}
		}, 100);
	}

2、动画结束时界面闪动问题: 如果有需要在动画结束的时候对layoutparameters或子控件布局参数进行修改的地方,一定要在onAnimationEnd的线程里修改,并且在修改完毕后一定要调用clearAnimation()方法来清理动画,防止布局改变后再次导致动画执行。如果放在别的进程里或者handler里,不同手机的CPU工作方式不一样,有可能导致先把layoutparamter或子布局的调整生效的时间在前,导致再次出现闪烁。

//折叠录音布局
	public void voiceLayoutFold(final boolean isShowInputMethod) {
		TranslateAnimation animation = new TranslateAnimation(0, 0, 0, DeviceUtil.getDensity(getContext()) * 260);
		animation.setDuration(500);
		mAnimView.setAnimation(animation);
		animation.setAnimationListener(new CommonAbstractImp.AnimationImp() {
			@Override
			public void onAnimationEnd(Animation animation) {
				animation.clearAnimation();//解决界面闪动的关键代码
				childView.setVisibility(View.GONE);
				if (isShowInputMethod) {
					//弹出键盘
					edit_content.requestFocus();
					DeviceUtil.showInputMethod(edit_content);
				}
			}
		});
		animation.startNow();
	}





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值