DotsIndicator 项目推荐:Android 分页指示器的终极解决方案
2026-01-29 12:26:00作者:江焘钦
还在为 Android 应用中的 ViewPager 分页指示器而烦恼吗?想要实现 Material Design 风格的优雅指示效果却苦于原生支持有限?DotsIndicator 项目正是你需要的完美解决方案!
📊 项目概览
DotsIndicator 是一个专为 Android 开发的轻量级库,提供多种 Material Design 风格的分页指示器组件,支持传统的 XML 布局和现代的 Jetpack Compose 两种开发方式。
🎯 核心特性
| 特性 | 描述 | 支持平台 |
|---|---|---|
| 多种指示器类型 | 4种 Compose 类型 + 3种 XML 类型 | Android |
| 双开发范式支持 | XML 布局 + Jetpack Compose | Android 4.0+ |
| 丰富自定义选项 | 颜色、大小、间距、动画效果等 | 全版本兼容 |
| ViewPager 兼容 | 支持 ViewPager 和 ViewPager2 | 全版本兼容 |
🚀 快速开始
添加依赖
在项目的 build.gradle 文件中添加依赖:
repositories {
google()
mavenCentral()
}
dependencies {
implementation("com.tbuonomo:dotsindicator:5.0")
}
Jetpack Compose 使用示例
@Composable
fun DotsIndicatorSample() {
var pageCount by remember { mutableStateOf(5) }
val pagerState = rememberPagerState()
Column {
HorizontalPager(
modifier = Modifier.padding(top = 24.dp),
pageCount = pageCount,
contentPadding = PaddingValues(horizontal = 64.dp),
pageSpacing = 24.dp,
state = pagerState
) {
PagePlaceholderItem()
}
DotsIndicator(
dotCount = pageCount,
type = ShiftIndicatorType(
dotsGraphic = DotGraphic(color = MaterialTheme.colorScheme.primary)
),
pagerState = pagerState
)
}
}
XML 布局使用示例
<com.tbuonomo.viewpagerdotsindicator.DotsIndicator
android:id="@+id/dots_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:dotsColor="@color/material_white"
app:dotsCornerRadius="8dp"
app:dotsSize="16dp"
app:dotsSpacing="4dp"
app:dotsWidthFactor="2.5"
app:selectedDotColor="@color/md_blue_200"
app:progressMode="true" />
🎨 指示器类型详解
Jetpack Compose 支持的 4 种类型
1. ShiftIndicatorType(平移指示器)
graph LR
A[默认状态] --> B[选中状态]
B --> C[过渡动画]
C --> D[完成切换]
DotsIndicator(
dotCount = pageCount,
type = ShiftIndicatorType(
dotsGraphic = DotGraphic(color = MaterialTheme.colorScheme.primary)
),
pagerState = pagerState
)
2. SpringIndicatorType(弹簧指示器)
graph TB
A[默认圆环] --> B[弹簧效果选中]
B --> C[弹性动画]
C --> D[稳定状态]
DotsIndicator(
dotCount = pageCount,
type = SpringIndicatorType(
dotsGraphic = DotGraphic(
16.dp,
borderWidth = 2.dp,
borderColor = MaterialTheme.colorScheme.primary,
color = Color.Transparent
),
selectorDotGraphic = DotGraphic(
14.dp,
color = MaterialTheme.colorScheme.primary
)
),
pagerState = pagerState
)
3. WormIndicatorType(蠕虫指示器)
sequenceDiagram
participant A as 默认点
participant B as 选中点
A->>B: 蠕虫式移动
B->>A: 平滑过渡
Note right of B: 连贯的动画效果
DotsIndicator(
dotCount = pageCount,
type = WormIndicatorType(
dotsGraphic = DotGraphic(
16.dp,
borderWidth = 2.dp,
borderColor = MaterialTheme.colorScheme.primary,
color = Color.Transparent,
),
wormDotGraphic = DotGraphic(
16.dp,
color = MaterialTheme.colorScheme.primary,
)
),
pagerState = pagerState
)
4. BalloonIndicatorType(气球指示器)
pie title 气球指示器效果
"默认大小" : 70
"选中放大" : 30
DotsIndicator(
dotCount = pageCount,
type = BalloonIndicatorType(
dotsGraphic = DotGraphic(
color = MaterialTheme.colorScheme.primary,
size = 8.dp
),
balloonSizeFactor = 2f
),
dotSpacing = 20.dp,
pagerState = pagerState
)
XML 布局支持的 3 种类型
1. DotsIndicator(基础指示器)
<com.tbuonomo.viewpagerdotsindicator.DotsIndicator
android:id="@+id/dots_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:dotsColor="@color/material_white"
app:dotsCornerRadius="8dp"
app:dotsSize="16dp"
app:dotsSpacing="4dp"
app:dotsWidthFactor="2.5"
app:selectedDotColor="@color/md_blue_200"
app:progressMode="true" />
2. SpringDotsIndicator(弹簧指示器)
<com.tbuonomo.viewpagerdotsindicator.SpringDotsIndicator
android:id="@+id/spring_dots_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:dampingRatio="0.5"
app:dotsColor="@color/material_white"
app:dotsStrokeColor="@color/material_yellow"
app:dotsCornerRadius="2dp"
app:dotsSize="16dp"
app:dotsSpacing="6dp"
app:dotsStrokeWidth="2dp"
app:stiffness="300" />
3. WormDotsIndicator(蠕虫指示器)
<com.tbuonomo.viewpagerdotsindicator.WormDotsIndicator
android:id="@+id/worm_dots_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:dotsColor="@color/material_blueA200"
app:dotsStrokeColor="@color/material_yellow"
app:dotsCornerRadius="8dp"
app:dotsSize="16dp"
app:dotsSpacing="4dp"
app:dotsStrokeWidth="2dp" />
🔧 自定义属性详解
通用属性配置表
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
dotsColor |
color | - | 点的颜色 |
dotsSize |
dimension | 16dp | 点的大小 |
dotsSpacing |
dimension | 4dp | 点之间的间距 |
dotsCornerRadius |
dimension | dotsSize/2 | 点的圆角半径 |
DotsIndicator 专属属性
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
selectedDotColor |
color | dotsColor | 选中点的颜色 |
progressMode |
boolean | false | 进度模式 |
dotsWidthFactor |
float | 2.5 | 点宽度因子 |
SpringDotsIndicator 弹簧属性
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
dotsStrokeColor |
color | dotsColor | 描边颜色 |
dotsStrokeWidth |
dimension | 2dp | 描边宽度 |
dampingRatio |
float | 0.5 | 阻尼比 |
stiffness |
float | 300 | 刚度系数 |
🎯 使用场景推荐
1. 应用引导页
flowchart TD
A[启动应用] --> B[显示引导页]
B --> C{用户滑动页面}
C -->|继续| D[DotsIndicator 更新]
C -->|跳过| E[进入主界面]
D --> B
2. 图片轮播图
// 在图片轮播场景中的使用
fun setupImageCarousel(viewPager: ViewPager2, images: List<Image>) {
val adapter = ImagePagerAdapter(images)
viewPager.adapter = adapter
val dotsIndicator = findViewById<DotsIndicator>(R.id.dots_indicator)
dotsIndicator.attachTo(viewPager)
// 自动轮播逻辑
lifecycleScope.launch {
while (true) {
delay(3000)
val nextPage = (viewPager.currentItem + 1) % images.size
viewPager.setCurrentItem(nextPage, true)
}
}
}
3. 产品详情页
classDiagram
class ProductDetailActivity {
+ViewPager2 productImagesPager
+DotsIndicator imagesIndicator
+setupImageIndicator()
}
class Product {
+List~Image~ images
}
ProductDetailActivity --> Product : 包含
ProductDetailActivity --> DotsIndicator : 使用
📈 性能优化建议
内存优化
// 避免内存泄漏的最佳实践
class MainActivity : AppCompatActivity() {
private lateinit var dotsIndicator: DotsIndicator
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dotsIndicator = findViewById(R.id.dots_indicator)
val viewPager = findViewById<ViewPager2>(R.id.view_pager)
// 正确绑定
dotsIndicator.attachTo(viewPager)
}
override fun onDestroy() {
// 清理资源
dotsIndicator.detach()
super.onDestroy()
}
}
动画性能
graph TB
A[硬件加速] --> B[60fps 流畅动画]
B --> C[内存占用优化]
C --> D[电池消耗降低]
D --> E[用户体验提升]
🔄 版本兼容性
Android 版本支持矩阵
| 版本 | 最低支持 | 推荐版本 | 特性完整性 |
|---|---|---|---|
| Android 4.0+ | ✅ 支持 | ❌ 不推荐 | 基础功能 |
| Android 5.0+ | ✅ 支持 | ⚠️ 一般 | 完整功能 |
| Android 8.0+ | ✅ 支持 | ✅ 推荐 | 最佳体验 |
Jetpack Compose 兼容性
timeline
title Jetpack Compose 版本兼容
section 1.0.x
基础支持 : 2021
section 1.2.x
性能优化 : 2022
section 1.4.x
稳定版本 : 2023
section 1.6.x
最新特性 : 2024
🛠️ 开发技巧
1. 动态更新点数
// 动态改变指示器点数
fun updateDotsCount(newCount: Int) {
dotsIndicator.dotCount = newCount
dotsIndicator.invalidate()
}
2. 自定义颜色主题
// 根据主题动态调整颜色
fun setupThemeAwareDots(theme: AppTheme) {
val primaryColor = when (theme) {
AppTheme.LIGHT -> Color.LightPrimary
AppTheme.DARK -> Color.DarkPrimary
AppTheme.AUTO -> getSystemPrimaryColor()
}
dotsIndicator.dotsColor = primaryColor.copy(alpha = 0.3f)
dotsIndicator.selectedDotColor = primaryColor
}
3. RTL(从右到左)支持
// 启用RTL支持
dotsIndicator.layoutDirection =
if (isRtl) View.LAYOUT_DIRECTION_RTL
else View.LAYOUT_DIRECTION_LTR
📊 性能对比表
| 指标 | DotsIndicator | 原生实现 | 其他第三方库 |
|---|---|---|---|
| 内存占用 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 动画流畅度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 自定义灵活性 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
| 代码简洁性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ |
| 维护活跃度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
🚀 为什么选择 DotsIndicator?
优势总结
- 全面兼容:支持传统 XML 和现代 Jetpack Compose
- 丰富类型:7种不同的指示器效果满足各种设计需求
- 高性能:优化的动画性能和内存管理
- 易于使用:简洁的 API 和详细的文档
- 活跃维护:持续更新和 bug 修复
适用开发者
- ✅ 追求 Material Design 效果的开发者
- ✅ 需要多种分页指示器选择的团队
- ✅ 同时维护传统和现代代码库的项目
- ✅ 注重性能和用户体验的应用
🎯 结语
DotsIndicator 项目为 Android 开发者提供了一个强大、灵活且易于使用的分页指示器解决方案。无论你是使用传统的 XML 布局还是现代的 Jetpack Compose,这个库都能为你提供出色的用户体验和开发体验。
通过丰富的自定义选项、优秀的性能和活跃的社区支持,DotsIndicator 已经成为 Android 开发中分页指示器的首选解决方案。立即尝试,为你的应用添加专业级的分页指示效果!
💡 提示: 在实际项目中使用时,建议始终使用最新版本以获得最佳的性能和最新的功能特性。
登录后查看全文
热门项目推荐
相关项目推荐
GLM-5智谱 AI 正式发布 GLM-5,旨在应对复杂系统工程和长时域智能体任务。Jinja00
GLM-5-w4a8GLM-5-w4a8基于混合专家架构,专为复杂系统工程与长周期智能体任务设计。支持单/多节点部署,适配Atlas 800T A3,采用w4a8量化技术,结合vLLM推理优化,高效平衡性能与精度,助力智能应用开发Jinja00
请把这个活动推给顶尖程序员😎本次活动专为懂行的顶尖程序员量身打造,聚焦AtomGit首发开源模型的实际应用与深度测评,拒绝大众化浅层体验,邀请具备扎实技术功底、开源经验或模型测评能力的顶尖开发者,深度参与模型体验、性能测评,通过发布技术帖子、提交测评报告、上传实践项目成果等形式,挖掘模型核心价值,共建AtomGit开源模型生态,彰显顶尖程序员的技术洞察力与实践能力。00
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
MiniMax-M2.5MiniMax-M2.5开源模型,经数十万复杂环境强化训练,在代码生成、工具调用、办公自动化等经济价值任务中表现卓越。SWE-Bench Verified得分80.2%,Multi-SWE-Bench达51.3%,BrowseComp获76.3%。推理速度比M2.1快37%,与Claude Opus 4.6相当,每小时仅需0.3-1美元,成本仅为同类模型1/10-1/20,为智能应用开发提供高效经济选择。【此简介由AI生成】Python00
Qwen3.5Qwen3.5 昇腾 vLLM 部署教程。Qwen3.5 是 Qwen 系列最新的旗舰多模态模型,采用 MoE(混合专家)架构,在保持强大模型能力的同时显著降低了推理成本。00- RRing-2.5-1TRing-2.5-1T:全球首个基于混合线性注意力架构的开源万亿参数思考模型。Python00
热门内容推荐
最新内容推荐
Degrees of Lewdity中文汉化终极指南:零基础玩家必看的完整教程Unity游戏翻译神器:XUnity Auto Translator 完整使用指南PythonWin7终极指南:在Windows 7上轻松安装Python 3.9+终极macOS键盘定制指南:用Karabiner-Elements提升10倍效率Pandas数据分析实战指南:从零基础到数据处理高手 Qwen3-235B-FP8震撼升级:256K上下文+22B激活参数7步搞定机械键盘PCB设计:从零开始打造你的专属键盘终极WeMod专业版解锁指南:3步免费获取完整高级功能DeepSeek-R1-Distill-Qwen-32B技术揭秘:小模型如何实现大模型性能突破音频修复终极指南:让每一段受损声音重获新生
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
567
3.83 K
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
892
667
Ascend Extension for PyTorch
Python
376
445
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
349
200
昇腾LLM分布式训练框架
Python
116
145
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.37 K
778
暂无简介
Dart
798
197
React Native鸿蒙化仓库
JavaScript
308
359
openJiuwen agent-studio提供零码、低码可视化开发和工作流编排,模型、知识库、插件等各资源管理能力
TSX
1.13 K
271