[Android]自定义RecyclerView中View的动画

这篇具有很好参考价值的文章主要介绍了[Android]自定义RecyclerView中View的动画。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考默认动画类DefaultItemAnimator

官方有一个默认Item动画类DafaultItemAnimator,其中 DefaultItemAnimator 继承了SimpleItemAnimator 继承了 RecyclerView.ItemAnimator

  1. SimpleItemAnimator 它是一个包装类,用来判断当前的ViewHolder到底是执行移动、移除、添加或者改变等行为。
  2. DefaultItemAnimator 是执行具体动画类,它负责将viewHolder初始化、保存需要执行动画的ViveHolder以及动画信息、执行具体的动画。 我们自定义ItemAnimtor 也是仿照这个来的。
  3. 其中DefaultItemAnimator中 animate + 动作 为名的的方法(比如animateAdd())做的事情有:计算动画信息,保存动画信息,初始化view的状态,且可以控制该VIewHolder是否执行该次动画,如果返回值为false那么那么不会执行该ViewHolder的改次动画。
  4. DefaultItemAnimator中animate + 动作 + Impl 为名的方法,做的动作是执行具体的动画动作。
  5. runPendingAnimations是最终执行具体动画的方法

产生动画的流程

RecyclerView 的 onLayout 方法主要调用了 dispatchLayout 方法,dispatchLayout 中保障了 dispatchLayoutStep1、2、3 三个方法的执行。

dispatchLayoutStep1

  1. 首先将当前屏幕中的 items 信息保存;(生成 ItemHolderInfo 赋值给 InfoRecord 的 preInfo 并且对其 flags 添加 FLAG_PRE ,再将 InfoRecord 添加到 ViewInfoStore 的 mLayoutHolderMap 中
  2. 进行预布局;(调用 LayoutManager 的 onLayoutChildren)
  3. 预布局完成后和第 1 步中保存的信息对比,将新出现的 item 信息保存;(和第 1 步中不同的是 flags 设置的是 FLAG_APPEAR)

dispatchLayoutStep2

  1. 将预布局 boolean 值改为 flase;
  2. 进行真正布局;(调用 LayoutManager 的 onLayoutChildren)

dispatchLayoutStep3

  1. 将真正布局后屏幕上的 items 信息保存;(与 dispatchLayoutStep1 不同的是赋值给 InfoRecord 的 postInfo 并且 flags 添加 FLAG_POST)
  2. 执行动画,调用 ViewInfoStore.process();
  3. 布局完成回调,onLayoutCompleted;

仿照 DefaultItemAnimator 搭建据图框架Base框架

public class BaseItemAnimator extends SimpleItemAnimator {
    //业务控制是否执行该viewHolder的动画  比如通讯录列表,判断只有联
    //系人的ViewHolder执行动画,如果是分组头部ViewHolder则不执行动画
    @Override
    public boolean animateRemove(RecyclerView.ViewHolder holder) {
        // 计算 holder的动画参数 如:x偏移量 y轴偏移量 透明度等等
        // 保存 viewHolder 以及 动画参数
        //  业务控制是否执行该viewHolder的动画  
        //      比如通讯录列表,判断只有联系人的ViewHolder执行动画,
        //      如果是分组头部ViewHolder则不执行动画
        return false;
    }

    @Override
    public boolean animateAdd(RecyclerView.ViewHolder holder) {
        // 计算 holder的动画参数 如:x偏移量 y轴偏移量 透明度等等
        // 保存 viewHolder 以及 动画参数
        //  业务控制是否执行该viewHolder的动画  
        return false;
    }


    //用于控制添加,移动更新时,其它Item的动画执行
    @Override
    public boolean animateMove(RecyclerView.ViewHolder holder, int fromX, int fromY, int toX, int toY) {
        // 计算 holder的动画参数 如:x偏移量 y轴偏移量 透明度等等
        // 保存 viewHolder 以及 动画参数
        //  业务控制是否执行该viewHolder的动画  
        return false;
    }

    //Item更新回调
    @Override
    public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) {
        // 计算 holder的动画参数 如:x偏移量 y轴偏移量 透明度等等
        // 保存 viewHolder 以及 动画参数
        //  业务控制是否执行该viewHolder的动画  
        return false;
    }

    //真正控制执行动画的地方
    //关键方法,参考DafaultItemAnimator的执行,在具体的子方法下面去修改和重载
    @Override
    public void runPendingAnimations() {
            // 根据保存的 viewHolder 以及 animInfo   执行动画
    }
	...
}

给 RecyclerView 设置动画调用 setItemAnimator 方法,将自定义的Animator设置给RecyclerView即可。

参考文章:

https://juejin.cn/post/7169857225949708301
https://www.jianshu.com/p/7171ea362513

源码:

MultiTypeAdapter文章来源地址https://www.toymoban.com/news/detail-503281.html

到了这里,关于[Android]自定义RecyclerView中View的动画的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android View动画之LayoutAnimation的使用

    接前篇 Android View动画整理 ,本篇介绍 LayoutAnimation 的使用。 参考《安卓开发艺术探索》。 View 动画作用于 View 。 LayoutAnimation 则作用于 ViewGroup , 为 ViewGoup 指定一个动画,ViewGoup 的子 View 出场时就具体动画效果。 简言之,LayoutAnimation 是为 ViewGroup 的子View指定出场动画。 开

    2024年02月11日
    浏览(40)
  • Android View的动画效果,上移展示和下移隐藏

    原文:Android View的动画效果,上移展示和下移隐藏-Stars-One的杂货小窝 项目里的一个小需求(实际是要和手势操作一起,上滑和下拉触发此动画效果),记录一下 PS: 本篇先记录下动画效果,下篇再将如何监听滑动手势 实际通过View的translationY的属性来实现 PS: withEndAction 方法实际也是设

    2024年03月22日
    浏览(49)
  • Android Text View 去掉默认的padding的实现方法

    先看下最终实现效果,满意您在往下看: TextView 绘制的时候自带一定的Padding值,要想实现去掉默认的padding值,xml文件可以设置一个属性值 : 然后运行起来就会发现,并没有什么卵用,也不能说完全没有,但效果差点意思。我就不运行了,在编译器上也能大概看到效果,如

    2024年01月19日
    浏览(31)
  • Android自定义View流程

    在开发中,View视图具有非常重要的作用,它是直接呈现给使用者的,因此向用户展示精美高效的View视图很有意义。Android系统提供了丰富的视图组件,如TextView、ImageView、Button等,还提供了RelativeLayout、LinearLayout、FrameLayout等组合组件,使用这些组件搭配能实现良好的视图效果

    2024年04月11日
    浏览(48)
  • android 自定义圆角View

    public class CustomView extends View {     private float cornerRadius;     public CustomView(Context context) {         super(context);         init();     }     public CustomView(Context context, AttributeSet attrs) {         super(context, attrs);         TypedArray typedArray = context.obt

    2024年02月11日
    浏览(49)
  • android开发之Android 自定义滑动解锁View

    自定义滑动解锁View 需求如下: 近期需要做一个类似屏幕滑动解锁的功能,右划开始,左划暂停。 需求效果图如下 实现效果展示 自定义view如下 /** Desc 自定义滑动解锁View Author ZY Mail sunnyfor98@gmail.com Date 2021/5/17 11:52 */ @SuppressLint(“ClickableViewAccessibility”) class SlideSwitchButton :

    2024年02月13日
    浏览(36)
  • Android 自定义View 之 圆环进度条

      很多时候我们会使用进度条,而Android默认的进度条是长条的,从左至右。而在日常开发中,有时候UI为了让页面更美观,就需要用到圆环进度条,那么本文就是通过自定义写一个圆环进度条,首先看一下效果图:   关于自定义View的基础知识就不再做过多的讲解了,我

    2024年02月10日
    浏览(47)
  • Android:绘制自定义View人脸识别框

    项目开发需要自定义View实现一个人脸框,代码实现很平常,一些细节记录一下,方便以后查阅。 代码实现: FaceView.java 注意: 这里我把FaceView的layout_width、layout_height都设置成了\\\"match_parent\\\" 这里面有个 坑 容易踩到 本次开发时,xml中FaceView控件往上一直到第一层父布局宽、高

    2024年02月09日
    浏览(64)
  • Android 自定义View之圆形进度条

    很多场景下都用到这种进度条,有的还带动画效果, 今天我也来写一个。 写之前先拆解下它的组成: 底层圆形 上层弧形 中间文字 那我们要做的就是: 绘制底层圆形; 在同位置绘制上层弧形,但颜色不同; 在中心点绘制文本,显示进度。 按照这个目标,学习下自定义Vi

    2024年02月09日
    浏览(44)
  • Android 自定义View 之 Dialog弹窗

      在日常开发中用到弹窗是比较多的,常用于提示作用,比如错误操作提示,余额不足提示,退出登录提示等,还有用于数据展示的弹窗,上拉弹窗等等,主要为了简化在日常开发中的使用。   Android中的Dialog弹窗是一种用于展示特定信息或者在用户需要进行某些操作时

    2024年02月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包