企业网站做备案正规专业的互联网代做毕业设计网站

张小明 2025/12/31 20:47:01
企业网站做备案,正规专业的互联网代做毕业设计网站,仿蘑菇街wordpress主题,广州网站seo在 Android 开发中#xff0c;我们经常需要为 RecyclerView、ViewPager 或 HorizontalScrollView 添加一个可视化的滚动指示器。虽然系统自带的 ScrollBar 能满足基本需求#xff0c;但如果 UI 设计要求指示器有固定的宽度、圆角以及特定的颜色#xff0c;自定义 View 往往是…在 Android 开发中我们经常需要为RecyclerView、ViewPager或HorizontalScrollView添加一个可视化的滚动指示器。虽然系统自带的 ScrollBar 能满足基本需求但如果 UI 设计要求指示器有固定的宽度、圆角以及特定的颜色自定义 View 往往是最佳选择。本文将带你使用 Kotlin 实现一个轻量级、高性能的水平滑动指示器组件BottomLineView并详细讲解如何适配主流的滚动控件。1. 核心组件实现BottomLineView我们创建一个继承自View的类BottomLineView。它不依赖具体的滚动控件只接收指示器宽度和滚动比例两个参数实现了高度解耦。class BottomLineView JvmOverloads constructor( context: Context, attrs: AttributeSet? null, defStyleAttr: Int 0 ) : View(context, attrs, defStyleAttr) { private lateinit var paintGray: Paint // 背景线画笔 private lateinit var paintGreen: Paint // 指示器画笔 private var indicatorWidth 0f // 指示器的固定宽度 private var currentOffset 0f // 当前偏移量 init { initPaint() } private fun initPaint() { // 背景线灰色圆角 paintGray Paint().apply { color -0x333334 // 0xFFCCCCCC strokeCap Paint.Cap.ROUND strokeWidth 10f isAntiAlias true } // 指示器绿色圆角 paintGreen Paint().apply { color -0xff0100 // 0xFF00FF00 strokeCap Paint.Cap.ROUND strokeWidth 10f isAntiAlias true } } override fun onDraw(canvas: Canvas) { super.onDraw(canvas) val centerY height / 2f val totalWidth width.toFloat() // 1. 绘制背景线 canvas.drawLine(0f, centerY, totalWidth, centerY, paintGray) // 2. 绘制指示器确保不越界 val start max(0f, min(currentOffset, totalWidth - indicatorWidth)) val end start indicatorWidth if (indicatorWidth 0) { canvas.drawLine(start, centerY, end, centerY, paintGreen) } } /** 设置指示器物理宽度 */ fun setIndicatorWidth(width: Float) { this.indicatorWidth width invalidate() } /** 更新滚动比例 (0.0 ~ 1.0) */ fun updateScrollRatio(ratio: Float) { val maxOffset width - indicatorWidth this.currentOffset maxOffset * ratio invalidate() } }2. 场景适配指南下面是三种最常见的滚动控件适配方案。场景一与 RecyclerView 联动这是最常用的场景。利用computeHorizontalScrollXXX系列方法可以精确计算滚动位置。// 1. 设置指示器宽度 bottomLineView.setIndicatorWidth(100f) // 2. 监听滚动 recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { // 获取滚动参数 val offset recyclerView.computeHorizontalScrollOffset() // 当前偏移 val range recyclerView.computeHorizontalScrollRange() // 内容总宽 val extent recyclerView.computeHorizontalScrollExtent() // 可见宽度 // 计算最大可滚动距离 val maxScroll range - extent if (maxScroll 0) { val ratio offset.toFloat() / maxScroll bottomLineView.updateScrollRatio(ratio) } } })场景二与 HorizontalScrollView 联动HorizontalScrollView需要 API 23 (Android 6.0) 以上才能通过setOnScrollChangeListener监听。如果是低版本可能需要继承并重写onScrollChanged。horizontalScrollView.setOnScrollChangeListener { _, scrollX, _, _, _ - // 1. 获取子 View (内容) val contentView horizontalScrollView.getChildAt(0) ?: returnsetOnScrollChangeListener // 2. 计算最大可滚动距离 内容宽度 - 容器宽度 val maxScroll contentView.width - horizontalScrollView.width if (maxScroll 0) { val ratio scrollX.toFloat() / maxScroll bottomLineView.updateScrollRatio(ratio) } }场景三与 ViewPager2 联动ViewPager2的计算逻辑略有不同因为它是按“页”滚动的。viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { super.onPageScrolled(position, positionOffset, positionOffsetPixels) // 假设 Adapter 中有 itemCount val itemCount adapter.itemCount if (itemCount 1) { // 计算总进度 // 当前页索引 当前页偏移百分比 val currentProgress position positionOffset // 总的可移动页数 总页数 - 1 val totalProgress (itemCount - 1).toFloat() val ratio currentProgress / totalProgress bottomLineView.updateScrollRatio(ratio) } } })3. 总结通过将 UI 绘制逻辑封装在BottomLineView内部并将状态更新抽象为updateScrollRatio(0.0~1.0)接口我们成功地让这个指示器适配了 Android 所有的水平滚动组件。无论底层是用 RecyclerView 还是 ViewPagerUI 层的表现都一样丝滑流畅。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

广渠门网站建设网址在线生成短链接

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个Python脚本,使用AI自动检测和修复SSL证书验证问题。脚本应能:1) 分析给定的URL或API端点 2) 检查证书链有效性 3) 自动生成修复方案(如信…

张小明 2025/12/29 2:36:55 网站建设

静态网站没有后台wordpress约课系统

### 基于CP的天元算盘系统"长度-长"定义及工程实现方案 #### 一、"长度-长"的跨学科定义与物理映射 在CP天元算盘系统中,"长度-长" ($\mathcal{L}$) 定义为**量子-经典维度转换基准**,其核心特性融合通信、量子和计量学…

张小明 2025/12/29 2:36:55 网站建设

成都网站建设公司服务纺织行业网站怎么做吸引人

第一章:Open-AutoGLM私有化部署的背景与意义随着企业对数据安全与模型可控性的要求日益提升,大语言模型的私有化部署逐渐成为关键趋势。Open-AutoGLM 作为一款支持自动化任务处理与自然语言理解的开源大模型,其在本地环境中的独立部署能力&am…

张小明 2025/12/29 2:36:53 网站建设

最好的网站模板网站企业网站带后台模板

PaddlePaddle EfficientDet 实现对比评测 在智能制造与工业自动化加速推进的今天,视觉质检系统正面临前所未有的挑战:如何在有限算力下实现高精度、低延迟的目标检测?传统基于规则的图像处理方法已难以应对复杂纹理、微小缺陷和多变工况。深度…

张小明 2025/12/30 14:07:32 网站建设

北京网站制作公司招聘信息学校的网站管理系统

第一章:性能测试工具选型的关键维度在构建高效可靠的性能测试体系时,工具的选型直接影响测试结果的准确性与可维护性。合理的工具选择需综合评估多个关键维度,确保其能够匹配系统架构、团队技能和业务目标。功能覆盖能力 理想的性能测试工具应…

张小明 2025/12/29 2:36:59 网站建设

成功的电子商务网站设计装修队做网站

想要让你的AI模型既具备天马行空的创造力,又保持稳定可靠的性能表现吗?掌握AI模型调优技巧,你就能在创造力平衡与参数优化之间找到最佳配置点。本文将为你揭示如何通过精准的参数配置,让智能体性能提升到全新高度。 【免费下载链接…

张小明 2025/12/29 2:36:59 网站建设