SwipeRefreshLayout实现原理解析

2024-03-30 14:48

本文主要是介绍SwipeRefreshLayout实现原理解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述:

下拉刷新在实际项目中使用到的频次很高,尤其是带列表的界面中,几乎有列表就会有下拉刷新的功能出现,网上开源的下拉刷新库也较多如PullToRefresh等,近期查看了google提供的SwipeRefreshLayout下拉刷新库,因其功能强大,代码结构简单,便于修改自定义(事实上有很多开源的下拉刷新库也是基于该库进行的修改),专门查看了其实现逻辑,简单记录下来。

涉及文件路径:

\frameworks\support\swiperefreshlayout\src\main\java\androidx\swiperefreshlayout\widget\SwipeRefreshLayout.java
frameworks\support\swiperefreshlayout\src\main\java\androidx\swiperefreshlayout\widget\CircularProgressDrawable.java
frameworks\support\swiperefreshlayout\src\main\java\androidx\swiperefreshlayout\widget\CircleImageView.java

原理简析

swiperefreshlayout继承自ViewGroup,以前分析过点击事件在activity中的传递,先到activity,然后自顶向下的一层层传递给视图控件,这里正是通过检测拦截点击事件onInterceptTouchEvent查看其子view是否可以继续向上滚动,如果不可以了,那就拦截该点击事件,自己来处理,通过检测移动事件,将一开始在构造函数中初始化完成的CircleImageView移动到z轴顶层,然后根据下拉量变大变小,且调整其中的进度线条透明度实现下拉刷新功能。

构造函数分析

构造函数主要初始化了刷新控件的直径,然后将其移动到Z轴上层,Y轴负直径的偏移位置,
准备完毕刚好刷新控件的底部在屏幕的顶部,等待下拉事件的到来。

        //初始化加速器mDecelerateInterpolator = new DecelerateInterpolator(DECELERATE_INTERPOLATION_FACTOR);final DisplayMetrics metrics = getResources().getDisplayMetrics();//初始化圆圈直径mCircleDiameter = (int) (CIRCLE_DIAMETER * metrics.density);//初始化刷新控件createProgressView();setChildrenDrawingOrderEnabled(true);//计算初始偏移量mSpinnerOffsetEnd = (int) (DEFAULT_CIRCLE_TARGET * metrics.density);mTotalDragDistance = mSpinnerOffsetEnd;mNestedScrollingParentHelper = new NestedScrollingParentHelper(this);mNestedScrollingChildHelper = new NestedScrollingChildHelper(this);setNestedScrollingEnabled(true);//初始化原始顶部偏移,为负的圆环直径mOriginalOffsetTop = mCurrentTargetOffsetTop = -mCircleDiameter;moveToStart(1.0f);
    //初始化mCircleView和mProgress,并将其隐藏添加到viewgroup中private void createProgressView() {mCircleView = new CircleImageView(getContext(), CIRCLE_BG_LIGHT);mProgress = new CircularProgressDrawable(getContext());mProgress.setStyle(CircularProgressDrawable.DEFAULT);mCircleView.setImageDrawable(mProgress);mCircleView.setVisibility(View.GONE);addView(mCircleView);}
    void moveToStart(float interpolatedTime) {int targetTop = 0;//此时mFrom为0,interpolatedTimewei为1,mOriginalOffsetTop为负的直径targetTop = (mFrom + (int) ((mOriginalOffsetTop - mFrom) * interpolatedTime));int offset = targetTop - mCircleView.getTop();//这里offset为负的直径,设置便宜后刷新view刚好不在屏幕范围内setTargetOffsetTopAndBottom(offset);}
    //设置偏移量,这里的offset为负的直径,所以刚好偏移出屏幕void setTargetOffsetTopAndBottom(int offset) {//将mCircleView从z轴移动到上层mCircleView.bringToFront();ViewCompat.offsetTopAndBottom(mCircleView, offset);mCurrentTargetOffsetTop = mCircleView.getTop();}

这篇关于SwipeRefreshLayout实现原理解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

Pydantic中model_validator的实现

《Pydantic中model_validator的实现》本文主要介绍了Pydantic中model_validator的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录引言基础知识创建 Pydantic 模型使用 model_validator 装饰器高级用法mo

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3