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

    大家都知道,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();
	}






版权声明:本文为biaobiao1217原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。