使用RecyclerView.ItemDecoration自定义RecyclerView圆角滚动条

news/2025/11/28 20:27:20/文章来源:https://www.cnblogs.com/fylx/p/19284087

使用RecyclerView.ItemDecoration自定义RecyclerView圆角滚动条

其实RecyclerView自带滚动条,设置android:scrollbars="vertical"即可。想让其长期显示,设置android:fadeScrollbars="false"即可。但是滚动条的端点样式是矩形的,有时会不符合设计要求,这时可以自定义一个滚动条来实现设计要求。

依据

主要想法是利用当前页第一条可视条目的位置计算滚动条的位置,再由当前页可视条目数量与总列表数量的比例计算滚动条在RecyclerView内的高度。

步骤一

继承类RecyclerView.ItemDecoration并实现方法onDrawOver方法

步骤二:在onDrawOver方法内实现以下逻辑

  • 取得第一条条目的位置
  • 均分容器高度
  • 根据当前页显示的数量,得出滚动条要显示的高度
  • 绘制直线(滚动条)

代码如下:

package com.hanvon;import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.View;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;public class Decoration extends RecyclerView.ItemDecoration {//抗锯齿 : Paint.ANTI_ALIAS_FLAG//闪烁时启动抖动 : Paint.DITHER_FLAGprivate final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);private float strokeWidth = 2;private float scrollbarMargin = 0;@Overridepublic void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {int childCount = parent.getChildCount();int itemCount = state.getItemCount();if (childCount == 0) return;Log.i("LayoutManager", "childCount: " + childCount + " itemCount=" + itemCount);paint.setStrokeWidth(1);paint.setColor(Color.RED);//绘制滚动条if (childCount == itemCount) return;//如果不超过两页,不用绘制滚动条//获取当前Page第一个条目的位置View childAt = parent.getChildAt(0);int position = parent.getChildLayoutPosition(childAt);//均分RecyclerView的高度,计算单条目录所占比重float itemHeight = (parent.getHeight() - strokeWidth) / itemCount;float half = strokeWidth / 2;int viewWidth = parent.getWidth();float x = viewWidth - scrollbarMargin - 1;//- half;//靠右绘制并显示右边距,所以要减掉边距和至少1线宽(当StrokeWidth=1时也能显示)paint.setStrokeWidth(strokeWidth);//线宽paint.setStrokeCap(Paint.Cap.ROUND);//圆角c.drawLine(x, position * itemHeight + half, x, (position + childCount) * itemHeight + half, paint);//测试辅助线/*paint.setTextSize(8f);paint.setStrokeWidth(1);c.drawLine(x - 4, 0, x - 4, parent.getHeight(), paint);for (int i1 = 0; i1 < itemCount + 2; i1++) {c.drawLine(0, i1 * itemHeight + half, viewWidth, i1 * itemHeight + half, paint);c.drawText("" + i1, viewWidth - 50, i1 * itemHeight - 8, paint);}*/}
}

要注意代码里面的float itemHeight = (parent.getHeight() - strokeWidth) / itemCount;计算减去了strokeWidth

原因是线端点样式设置成了paint.setStrokeCap(Paint.Cap.ROUND),所以预留了端点样式的绘制位置,如果预留的话,在边沿的位置端点会被截断而不显示。

步骤三,在RecyclerView上使用该ItemDecoration

rvList.addItemDecoration(new Decoration());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/980074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SkeyeVSS视频融合系统——安全帽AI检测算法 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

技术分析:越南部分银行 App 不当使用 iOS 私有 API

技术分析:越南部分银行 App 不当使用 iOS 私有 API 原文标题: Technical Analysis - Improper Use of Private iOS APIs in some Vietnamese Banking Apps 来源: Verichains Blog https://blog.verichains.io/p/techn…

U636457 刺客

设 \(f_i\) 表示第一次到达 \(i\) 的所用时间,初始 \(f_1 = 0\)。 首先考虑运动的形态会是什么样子,应该是第一次走到 \(i\),然后不断的跳 \(p_i\),直到再一次走到 \(i\),再向 \(i + 1\) 走。 其实转移是很好转移…

Windows Docker 安装 RabbitMQ(包含客户端图形界面) - Higurashi

一、安装前准备 确保你的 Windows 上已经:安装 Docker Desktop 已开启 WSL2(Docker 默认要求)验证 Docker 是否正常: docker --version二、拉取带管理界面插件的 RabbitMQ 镜像 RabbitMQ 官方镜像里带管理界面的版…

《R语言医学数据分析实战》学习记录|第三章 数据框的操作

第三章 数据框的操作 内容记录 TLDR记录数据框结构数据的基本属性(清单列表:head(),tail(),摘要数据:str(),epiDisplay::des()) 操作数据框数据:选取子集subset(),增删元素 dplyr包对数据框数据的操作:筛选,排序…

软件工程学习日志2025.11.28

📋 实验内容概述 本次实验分为两大部分:Linux基础命令操作和Hadoop环境实践,旨在为后续大数据实验打下坚实的基础。 🎯 具体完成内容 一、Linux操作部分(2.5小时)目录操作命令成功掌握的cd命令操作 cd /usr/lo…

2025年11月晶振厂家推荐:权威榜与选择指南

在电子元器件领域,晶振作为时钟频率的核心部件,其性能直接影响整个系统的稳定性和可靠性。随着5G通信、物联网、汽车电子等行业的快速发展,市场对高精度、高稳定性晶振的需求持续增长。许多工程师、采购人员或企业决…

2025年11月晶振厂家推荐榜单:主流厂商综合对比与选择指南

在电子设备日益精密的今天,晶振作为时钟频率的核心元件,其稳定性与可靠性直接关系到整个系统的性能。无论是通信基站、工业控制、汽车电子还是消费类产品,工程师在选择晶振厂家时往往面临诸多考量,例如厂家的技术实…

漏洞赏金猎人的深度侦察方法论 | 第一部分

本文详细介绍了漏洞赏金猎人的侦察方法论,包括范围审查、子域名枚举等关键步骤,帮助安全研究人员系统性地发现潜在漏洞和安全风险。漏洞赏金猎人的深度侦察方法论 | 第一部分 仅供会员阅读的故事 作者:Abhijeet Kum…

2025年11月晶振厂家推荐:权威榜单与选择指南

在电子元器件领域,晶振作为时钟频率的核心部件,其性能直接影响整机设备的稳定性和可靠性。随着5G通信、物联网、汽车电子等产业的快速发展,市场对高精度、高稳定性晶振的需求持续增长。根据行业报告显示,全球晶振市…

高效且常用的国产AI工具

一是“工具线”:本书详解了16个高效且常用的国产AI工具,包括文心一言、Kimi、WPSAI、百度文库、橙篇、豆包、通义、智谱清言、秘塔、文心一格、天工AI、讯飞星火、360智绘、剪映、即梦AI及可灵AI,并且随书再附赠10款…

2025年11月晶振厂家推荐榜单:主流厂商综合对比选择指南

在电子元器件采购与供应链管理过程中,晶振作为时钟频率核心元件,其稳定性与可靠性直接影响整机性能。随着5G通信、物联网、汽车电子等新兴领域快速发展,市场对高精度、低功耗、小型化晶振需求持续增长。根据工信部2…

2025年11月晶振厂家推荐榜单:知名品牌综合对比与选购指南

在电子元器件领域,晶振作为时钟频率的核心元件,其性能稳定性直接影响到整个电路系统的可靠性。随着5G通信、物联网、汽车电子等行业的快速发展,市场对高精度、低功耗、小尺寸晶振的需求持续增长。根据行业权威报告显…

YXC扬兴科技联系方式:产品服务与技术支持相关指南

深圳扬兴科技有限公司(下面简称:YXC),自2010年成立以来,一直专注于时钟频率器件的研发、生产和销售,是业界领先的半导体高新技术企业。 公司主营产品包括晶振、可编程振荡器、VCXO/TCXO/OCXO、三级钟、锁相环芯片…

13.2.3.Tomcat - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

选择性检索增强代码补全技术解析

介绍一种基于自监督学习的代码补全方法,通过选择性检索机制在保持准确性的同时将推理速度提升70%,解决了大型代码仓库中跨文件依赖的智能补全问题。选择性检索增强的仓库级代码补全 大型代码模型在基于上下文完成任意…

W55MH32 网络继电器三模自由控制:小程序按键网页随选 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Day49(19)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02\tlias-web-management

登录设置HTTP:无状态响应:本次响应不携带上一次响应内容cookieJWT令牌老版本 package com.itheima;import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; impor…

Azure DevOps Server 2022.2 补丁(Patch 7)

Azure DevOps Server 2022.2 补丁(Patch 7)Azure DevOps Server RC版本在持续改进中,但是不影响上一个大版本的修复补丁进度;今天,微软又按照管理发布了月度补丁:Azure DevOps Server 2022.2 补丁(Patch 7),补…

U636462 无根树

noip 前一天锻炼手感。 设 \(f_i\) 为 \(i\) 到终点的答案。 那么每次转移 \(u\) 这个点的时候,令其出点 \(v\) 的贡献为 \(w + f_v\),那么敌人一定会选择最小的 \(d\) 个点办掉,此时你的答案一定为第 \(d + 1\) 小…