android中关于位移动画TranslateAnimation开始和结束时闪动问题的记录
2016-05-14 16:09
1006 查看
大家都知道,android下动画效果如果想在动画结束的时候就停留在最后一帧画面上,则可以使用
Animation的setFillAfter(true) 来设置一下。但是在实际应用中我们往往会在动画开始或结束时做一些操作,当所做的操作是改变开启动画控件的布局或子控件的显隐状态时,如果处理不当往往会出现闪动问题,下面就我在项目中用到的位移动画分别来分析开始和结束时闪动的问题。
1、动画开始时界面闪动问题:
上面代码乍看之下并没有什么问题,调用了mAnimView.clearAnimation()方法清理了原有的动画,然后将位移动画设置给了mAnimView,由于是从底部向上弹出的,如果直接执行动画,软键盘还没来及收回的话会直接从软键盘的顶部开始执行动画,所以给了一个延时时间才开始显示子布局并开始执行动画。但是经调试发现执行childView.setVisibility(View.VISIBLE)时会引起界面闪动,添加log日志发现这段代码竟然会导致动画的onAnimationStart()回调方法执行两次。最后经调试发现是因为先绑定动画事件,再改变布局引起的,即先调用mAnimView.setAnimation(animation),后调用 childView.setVisibility(View.VISIBLE)
引起的,更正后的代码就不会出现界面闪动的问题了:
2、动画结束时界面闪动问题:如果有需要在动画结束的时候对layoutparameters或子控件布局参数进行修改的地方,一定要在onAnimationEnd的线程里修改,并且在修改完毕后一定要调用clearAnimation()方法来清理动画,防止布局改变后再次导致动画执行。如果放在别的进程里或者handler里,不同手机的CPU工作方式不一样,有可能导致先把layoutparamter或子布局的调整生效的时间在前,导致再次出现闪烁。
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(); }
相关文章推荐
- android-----带你一步一步优化ListView(一)
- Android中的Rect类——奇葩的思维
- android:width与android:layout_width的区别
- 第一章:Android概论解析
- Android Studio安装
- Android AutoLayout自适应的适配方式
- Android数据存储方式
- AndroidStudio设置SVN版本控制工具
- 收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation
- Android 自定义SnakeBar
- 【转】Google推荐的命名规则——Android图片资源
- Android 一键生成Parcelable
- Ubuntu 12.10编译Android 4.0.3的常见错误
- Android 自定义checkbox样式
- 安卓绘制圆形图片
- android中加载本地图片到内存
- Android笔记hm002
- Android ListView 小技巧
- Android笔记hm001
- 关于Android中两个Activity之间为什么采用Intent封装意图的简介