当前位置: 首页 > 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.gsyq.cn/news/64380.html

相关文章:

  • 技术分析:越南部分银行 App 不当使用 iOS 私有 API
  • Windows Docker 安装 RabbitMQ(包含客户端图形界面) - Higurashi
  • 《R语言医学数据分析实战》学习记录|第三章 数据框的操作
  • 软件工程学习日志2025.11.28
  • 漏洞赏金猎人的深度侦察方法论 | 第一部分
  • 2025年11月晶振厂家推荐:权威榜单与选择指南
  • 2025年11月晶振厂家推荐榜单:知名品牌综合对比与选购指南
  • Day49(19)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02\tlias-web-management
  • 人工智能:用Gemini3一分钟生成手势控制3D粒子交互系统
  • 酶蛋白定向进化难题?泰克生物酵母展示服务,高效筛选“高活性酶”突变体
  • 上两个GPT写的锁,一个是文件锁,一个是Redis锁,写的那是相当的完美
  • 11月27号
  • 了解MySQL中的JSON_ARRAYAGG和JSON_OBJECT函数
  • 2025全年套管、绝缘套管、热收缩套管、热缩套管、热缩管厂家综合推荐与选购指南
  • MySQL的IFNULL()、ISNULL()、NULLIF()函数用法说明
  • Jenkins 已成过去式!新兴替代软件GitHub Actions即将崛起
  • P12828
  • XYD11.25模拟赛
  • day13-影刀RPA01
  • P2754
  • P10173
  • HTML表格列表
  • R语言包的几种安装形式
  • 详细介绍:计算机操作系统:用户层的I/O软件
  • 2025年11月上海水溶肥设备厂家推荐前十指南:专业选择与经验分享
  • 国内振动台厂家推荐:技术积累与行业服务能力观察
  • AI实现类人推理的技术探索
  • CSS基础--面向后端需要了解的前端知识
  • 2025年下半年江苏煤矿智能化/智能煤流系统开发公司综合推荐指南
  • 使用Postman进行接口测试、接口自动化和集成CI/CD