当前位置: 首页 > news >正文

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

使用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.jsqmd.com/news/54344/

相关文章:

  • SkeyeVSS视频融合系统——安全帽AI检测算法 - 教程
  • 技术分析:越南部分银行 App 不当使用 iOS 私有 API
  • U636457 刺客
  • Windows Docker 安装 RabbitMQ(包含客户端图形界面) - Higurashi
  • 《R语言医学数据分析实战》学习记录|第三章 数据框的操作
  • 软件工程学习日志2025.11.28
  • 2025年11月晶振厂家推荐:权威榜与选择指南
  • 2025年11月晶振厂家推荐榜单:主流厂商综合对比与选择指南
  • 漏洞赏金猎人的深度侦察方法论 | 第一部分
  • 2025年11月晶振厂家推荐:权威榜单与选择指南
  • 高效且常用的国产AI工具
  • 2025年11月晶振厂家推荐榜单:主流厂商综合对比选择指南
  • 2025年11月晶振厂家推荐榜单:知名品牌综合对比与选购指南
  • YXC扬兴科技联系方式:产品服务与技术支持相关指南
  • 13.2.3.Tomcat - 详解
  • 选择性检索增强代码补全技术解析
  • W55MH32 网络继电器三模自由控制:小程序按键网页随选 - 实践
  • Day49(19)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02\tlias-web-management
  • Azure DevOps Server 2022.2 补丁(Patch 7)
  • U636462 无根树
  • 人工智能:用Gemini3一分钟生成手势控制3D粒子交互系统
  • 酶蛋白定向进化难题?泰克生物酵母展示服务,高效筛选“高活性酶”突变体
  • 2025年免费简历模板排行榜:媲美付费版的优质选择
  • 考场备忘录
  • 软件测试:基本概念二
  • docker 复制远程镜像本地并创建容器
  • 上两个GPT写的锁,一个是文件锁,一个是Redis锁,写的那是相当的完美
  • DP动态规划进阶
  • 笔记本电脑外接显示器偶尔不亮
  • 11月27号