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
jiuwenclawJiuwenClaw 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。Python0192- QQwen3.5-397B-A17BQwen3.5 实现了重大飞跃,整合了多模态学习、架构效率、强化学习规模以及全球可访问性等方面的突破性进展,旨在为开发者和企业赋予前所未有的能力与效率。Jinja00
AtomGit城市坐标计划AtomGit 城市坐标计划开启!让开源有坐标,让城市有星火。致力于与城市合伙人共同构建并长期运营一个健康、活跃的本地开发者生态。01
awesome-zig一个关于 Zig 优秀库及资源的协作列表。Makefile00
项目优选
收起
deepin linux kernel
C
27
12
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
600
4.04 K
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
69
21
Ascend Extension for PyTorch
Python
440
531
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
112
170
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.46 K
823
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
921
770
暂无简介
Dart
845
204
React Native鸿蒙化仓库
JavaScript
321
375
openGauss kernel ~ openGauss is an open source relational database management system
C++
174
249