clearAnimation()解决setVisibility()无效问题
来源:互联网 发布:google translate软件 编辑:程序博客网 时间:2024/06/15 05:56
跟甜同学一起搞一个退场动画,第一次播放没问题,第二次播放就发现有个view会先闪出来一下,然后再执行从0到1的alpha动画。但是代码里明明已经用setVisibility(INVISIBLE)隐藏这个view了,为什么没有生效呢?Google了一下,有人说要调一下clearAnimation(),试了一下果然好了。。。
那么为什么加上这句就好了呢?得去看看framework的代码了,首先看一下View的clearAnimation():
public void clearAnimation() { if (mCurrentAnimation != null) { mCurrentAnimation.detach(); } mCurrentAnimation = null; invalidateParentIfNeeded(); }主要就是把mCurrentAnimation这个变量置空。这个变量是protected类型的,外面使用的话要通过getAnimation()这个接口:
public Animation getAnimation() { return mCurrentAnimation; }搜了一下发现ViewGroup的dispatchDraw()里用到了这个方法来判断是否要drawChild(),如果getAnimation()不为空,即使mViewFlags不是VISIBLE也要画:
protected void dispatchDraw(Canvas canvas) { ... ... if ((flags & FLAG_USE_CHILD_DRAWING_ORDER) == 0) { for (int i = 0; i < count; i++) { final View child = children[i]; if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { more |= drawChild(canvas, child, drawingTime); } } } else { for (int i = 0; i < count; i++) { final View child = children[getChildDrawingOrder(count, i)]; if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { more |= drawChild(canvas, child, drawingTime); } } } ... ... }OK,那么下面的问题就是,之前的动画已经结束了,为什么mCurrentAnimation没有被置空?在ViewGroup的finishAnimationView()方法里找到这一段:
void finishAnimatingView(final View view, Animation animation) { ... ... if (animation != null && !animation.getFillAfter()) { view.clearAnimation(); } ... ...}也就是说,如果我们调用了setFillAfter(true),动画结束的时候就不会调用clearAnimation(),mCurrentAnimation就不会被置空了。在我们实现的动画里,确实调用了setFillAfter(true)。。。
总结:做动画时,如果调用了setFillAfter(true),动画结束后如果要设置该view的可见性,需要先调用一次clearAnimation()。
0 0
- clearAnimation()解决setVisibility()无效问题
- setvisibility无效
- 安卓之setVisibility无效问题
- Android view.setVisibility()后调用layout()方法无效的问题
- Android ScrollView中view.setVisibility(View.VISIBLE)无效的问题
- android setVisibility 无效
- Android停止动画clearAnimation失效问题
- android setVisibility(View.Gone)无效
- Android的setVisibility(View.GONE)无效的问题及原因分析
- Android的setVisibility(View.GONE)无效的问题及原因分析
- 关于 View setVisibility()无效的情况
- setVisibility(View.GONE)无效的解决方案
- 解决VS断点无效问题
- 解决mAdapter.notifyDataSetChanged()无效问题
- 解决ios证书无效问题
- PathMenu 中 将ViewGroup 的子类setVisibility无效。
- 自定义RelativeLayout控件,setVisibility(View.INVISIBLE)竟然无效
- android中setVisibility方法无效的可能原因与解决办法
- C#注册和注销全局快捷键
- python自学之路-02
- Hibernate和Mybatis的优势
- Ubuntu下SSH安装或设置
- iOS和Android持续集成
- clearAnimation()解决setVisibility()无效问题
- 在java中如何在非servlet的普通类中获取request、response、session
- Android中RxJava+Retrofit+MVP模式的整合(1)—目录设计
- C#/C++ 文件中插入数据和文件后添加数据的几种方法
- XML与JSON的解析
- (反向代理 + cache) varnish 使用 (实例)
- day11.09
- 苏嵌9 16.11.8
- 将现有的代码,推送到一个新的GitHub Repo中