Animation导致removeView无效(源码分析)

2023-11-07 14:18

本文主要是介绍Animation导致removeView无效(源码分析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Animation导致removeView无效(源码分析)

继续入自定义View的坑,最近实现一个效果的时候,需要动态添加和删除View,所以就要用到ViewGroup中的removeView和addView,按理来说应该很简单,但是我遇到了一个问题,发现removeView无效。
最后发现:当你要remove的View正在执行Animation效果的时候,是无法remove掉的,所以需要先clearAnimation,再remove

从源码中证实了我的观点:

    public void removeViewAt(int index) {removeViewInternal(index, getChildAt(index));requestLayout();invalidate(true);}

我调用的是removeViewAt方法,可以看到,实际上起作用的是removeViewInternal方法

private void removeViewInternal(int index, View view) {...if (view.getAnimation() != null ||(mTransitioningViews != null && mTransitioningViews.contains(view))) {addDisappearingView(view);} else if (view.mAttachInfo != null) {view.dispatchDetachedFromWindow();}   ...}

一样,当我第一样看到这个方法,我是拒绝的,很长的方法体,非常多的变量不知道含义,第一次看我没有找到原因。第二次再看的时候,我发现了上面这段代码,非常符合我要寻找的问题,当View的Animation不是null的时候,会执行addDisappearingView(view)

    /*** Add a view which is removed from mChildren but still needs animation** @param v View to add*/private void addDisappearingView(View v) {ArrayList<View> disappearingChildren = mDisappearingChildren;if (disappearingChildren == null) {disappearingChildren = mDisappearingChildren = new ArrayList<View>();}disappearingChildren.add(v);}

可以看到,Google的解释其实已经很清楚了,添加一个带有动画效果的View。
我看到这还是有点不确定,这里面没有真正意义上的将Remove的View重绘到组件上。
所以我查询了mDisappearingChildren这个对象,看在哪里使用了这个对象

@Overrideprotected void dispatchDraw(Canvas canvas) {...// Draw any disappearing views that have animationsif (mDisappearingChildren != null) {final ArrayList<View> disappearingChildren = mDisappearingChildren;final int disappearingCount = disappearingChildren.size() - 1;// Go backwards -- we may delete as animations finishfor (int i = disappearingCount; i >= 0; i--) {final View child = disappearingChildren.get(i);more |= drawChild(canvas, child, drawingTime);}}...}

可以看到,我在dispatchDraw方法中找到了我想要的结果,可以看到,注释写的也很清楚,在重绘的时候,会将仍然有Animation的View绘制出来。
可以看到,这里遍历了mDisappearingChildren,调用了drawChild进行绘制。

到此问题解决,小小的看了一下源码,也是很有趣的

这篇关于Animation导致removeView无效(源码分析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/364179

相关文章

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序