官方控件SwipeRefreshLayout内嵌套滑动控件会导致进度条指示器空白并保留

2023-05-16

前言:准备实现一个刷新获取数据的功能,刷新的时候遇到了空白圈圈保留,于是开始查看SwipeRefreshLayout的源码并想了好几种方式去修复,最终采用反射

(第一次使用反射可能用的很糟糕,还请指点一下...)我的这个刷新比较明显,没有遮挡

(问题如下)

 

(已解决)

 

①:如果内嵌套一个滑动控件,滑动时向上滑动(停止滑动的操作)会保留一个白色的圈圈

即mCricleView (CircleImageView私有类)

可以发现但凡使用官方的SwiperRefreshLayout+内嵌套滑动控件就会导致此问题(比如哔哩哔哩)主界面滑动刷新如果突然停止并上滑一段距离,就会有白色圈圈保留,但是呢这个圈圈给TabLayout挡住了,只会有一层阴影是可以看的到(并不明显)

 

 

②:思路,获取mCircleView私有属性(但是CircleImageView作为私有类)即使获取也没法强转

③换个思路,通过反射获取进度条缩放动画的函数以及参数(动画事件)并且拦截触摸事件

在松手时调用动画强制取消,并且还得判断进度条旋转的数值是否到达临界值。

package com.crow.laser.view.component

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.animation.Animation.AnimationListener
import androidx.swiperefreshlayout.widget.CircularProgressDrawable
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import java.lang.reflect.Method

/*************************
 * @Machine: RedmiBook Pro 15 Win11
 * @Path: app/src/main/java/com/crow/laser/view/customviews
 * @Time: 2022/11/20 20:02
 * @Author: Crow
 * @Description: CustomSwiper 使用时全部反射属性仅作一次延迟初始化,减少在启动时的开销
 * @formatter:off
 **************************/
class CustomSwipeRefresh : SwipeRefreshLayout {

    constructor(context: Context) : super(context)
    constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)

    // 通过反射获取父类
    private val superClazz by lazy { javaClass.superclass }

    // 反射获取父类进度条
    private val mProgress: CircularProgressDrawable by lazy {
        superClazz.getDeclaredField("mProgress").apply { isAccessible = true }.get(this) as CircularProgressDrawable
    }

    // 反射获取ScaleDownMethod
    private val mScaleDownFunc: Method by lazy {
        superClazz.getDeclaredMethod("startScaleDownAnimation", AnimationListener::class.java).apply { isAccessible = true }
    }

    // 反射获取动画监听
    private val mRefreshListener: AnimationListener by lazy {
        superClazz.getDeclaredField("mRefreshListener").apply { isAccessible = true }.get(this) as AnimationListener
    }

    // -0.125f是进度条拖动到顶部的一个临界值 经过调试打印得到的。
    override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        if ((ev?.action == MotionEvent.ACTION_UP) and (mProgress.progressRotation == -0.125f)) {
            mScaleDownFunc.invoke(this, mRefreshListener)
        }
        return super.dispatchTouchEvent(ev)
    }
}

 转载可以,麻烦附上原链接..谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

官方控件SwipeRefreshLayout内嵌套滑动控件会导致进度条指示器空白并保留 的相关文章

  • IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)

    目录 满满的都是干货 所有插件都是在 ctrl 43 alt 43 s 里的plugins 里进行搜索安装 1 CodeGlance 代码迷你缩放图插件 2 Codota 安装 xff1a 3 Material Theme UI 4 Ali
  • elasticsearch 安装常见问题解决办法

    本文章记录安装es过程中碰到的各种常见问题及解决方案 目录 本文章记录安装es过程中碰到的各种常见问题及解决方案 1 elasticsearch 7 6 1 bin elasticsearch 启动报以杀死 这个问题 没有生成其他日志 只有
  • mysql my.ini

    Mysql my ini client 设置mysql客户端默认字符集 default character set 61 utf8 mysql 设置mysql客户端默认字符集 default character set 61 utf8 us
  • 看了这篇文!你就知道是选 elasticsearch 还是 solr

    什么是全文搜索引擎 本词条由 科普中国 科学百科词条编写与应用工作项目 审核 全文搜索引擎就是通过从互联网上提取的各个网站的信息 xff08 以网页文字为主 xff09 而建立的数据库中 xff0c 检索与用户查询条件匹配的相关记录 xff
  • GitHub宣布现在对团队免费

    原文 xff1a GitHub宣布对所有人私有仓库免费 https github blog 2020 04 14 github is now free for teams 我们很高兴地宣布 xff0c 我们正在为所有GitHub帐户提供不受
  • 知道什么是CAP吗?不知道还敢称程序员?搞笑呢?

    分布式系统 xff08 distributed system xff09 正变得越来越重要 xff0c 大型网站几乎都是分布式的 分布式系统的最大难点 xff0c 就是各个节点的状态如何同步 CAP 定理是这方面的基本定理 xff0c 也是
  • 面试官问:你讲讲分布式事务问题的几种方案?

    本文转自 芋道源码 https mp weixin qq com s 9KKY3pCKNkz1VOVEzdXp5g 面试题 面试官心理分析 面试题剖析 两阶段提交方案 XA方案 TCC 方案 本地消息表 可靠消息最终一致性方案 最大努力通知
  • spring 事务不生效的几种情况

    在这里就不接受spring 事务的ACID特性 事务的传播行为等等 xff0c 相信看到这篇的大佬们应该也对事务有所了解了不过多阐述 直接分析事务不生效的原因 开喽 xff01 情况 xff08 一 xff09 xff1a 64 Descr
  • Spring cloud gateway 设置https 和http同时支持

    Spring cloud gateway 处理跨域问题 Spring cloud gateway 拦截请求404 等HTTP 状态码 Spring cloud gateway 修改response 截断问题 xff0c 乱码问题解决 Spr
  • 一场HttpClient调用流未关闭引发的java 程序假死

    生成环境突然假死 xff0c nginx 也打不过去 xff0c nnnnnnnn 以为是启动时间久了 xff0c 随手在启动 xff0c 没过几分钟 程序继续假死 xff0c 查看nginx 日志 有很多请求 xff0c 所以问题无法进行
  • 列表拖拽,上下移动 java 接口实现

    列表拖拽实现 上下移动实现 列表拖拽实现 拖拽的逻辑 xff1a 按住某一个id 拖拽到需要移动的某个后面 如 xff1a 1 2 3 4 5 把 1 放到5的后面 列表改变顺序后变成 2 3 4 5 1 所以目前的代码实现逻辑为 把1 挨
  • CentOS8安装Mysql提示Error: Unable to find a match

    yum y install mysql community server Last metadata expiration check 0 13 40 ago on Sun 26 Apr 2020 11 20 57 AM CST No ma
  • 常见协议的默认端口

    常见协议的默认端口 1 HTTP协议 xff0c 服务器的默认端口号为 xff1a 80 2 HTTPS协议 xff0c 服务器默认的端口号为 xff1a 443 3 Telnet协议 xff0c 服务器默认的端口号为 xff1a 23 4
  • 锐捷交换机基本配置命令

    show ip interface brief 查看当前配置的ip地址 enable password admin 给enable配置密码 switchport trunk allowed vlan all 允许全部vlan通过 xff1f
  • 一道经典的数据库sql语句题目

    SQL查询题目 lt 列表视图页显示缩略图和文章摘要 gt lt 文章视图页显示全部内容 gt lt 如果有内容 xff0c 显示内容 gt SQL查询题目 条件 xff1a Student Sno Sname Sage Ssex 学生表
  • OpenCv+VS2017图像处理入门(一)

    安装VS2017 Visual Studio官网下载社区版VS2017 xff0c 安装教程照着网上做即可 安装OpenCv 官网下载opencv3 3 0 vc14 exe 3 配置OpenCv环境 xff08 1 xff09 计算机环境
  • 模板编程:C++11 可变模版参数的使用(逗号表达式、可变长数组、C#的委托实现)

    转载 xff1a 泛化之美 C 43 43 11可变模版参数的妙用 qicosmos 江南 博客园 cnblogs com 重点 xff1a 1 template lt class T gt 和template lt typenameT g
  • Qt------自定义标题栏(最小化、最大化、关闭、边框拉伸、拖动)

    转载 xff1a Qt之界面 xff08 自定义标题栏 无边框 可移动 缩放 xff09 我不是萧海哇 的博客 CSDN博客 参考了两篇文章处理 xff0c 还有半屏没处理 xff0c 就是左右边框的时候半屏 重点 xff1a 1 拖动需要
  • 服务器多解决方案编译

    服务器上的编译方法可以有多种 xff0c 其中一种方案是采用多解决方案 服务器编译项目采用的是多解决方案并行编译 xff0c 而本地编译是根据依赖顺序进行顺序编译 多解决方案的优点 xff1a 一般来说 xff0c 服务器端的软件较为复杂
  • OCC的模型的拓扑结构描述

    如下图所示 一个构件由两个面构成 拓扑结构的描述如下图所示 xff1a Shape gt 面 gt 线框 gt 边 gt 点

随机推荐