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 开发中分页指示器的首选解决方案。立即尝试,为你的应用添加专业级的分页指示效果!
💡 提示: 在实际项目中使用时,建议始终使用最新版本以获得最佳的性能和最新的功能特性。
登录后查看全文
热门项目推荐
相关项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0155- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
LongCat-Video-Avatar-1.5最新开源LongCat-Video-Avatar 1.5 版本,这是一款经过升级的开源框架,专注于音频驱动人物视频生成的极致实证优化与生产级就绪能力。该版本在 LongCat-Video 基础模型之上构建,可生成高度稳定的商用级虚拟人视频,支持音频-文本转视频(AT2V)、音频-文本-图像转视频(ATI2V)以及视频续播等原生任务,并能无缝兼容单流与多流音频输入。00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0112
热门内容推荐
最新内容推荐
项目优选
收起
deepin linux kernel
C
31
16
暂无描述
Dockerfile
733
4.76 K
Claude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed.
Get Started
Rust
1.26 K
155
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
1.1 K
612
Ascend Extension for PyTorch
Python
652
797
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.68 K
990
AI 将任意文档转换为精美可编辑的 PPTX 演示文稿 — 无需设计基础 | 包含 15 个案例、229 页内容
Python
147
10
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.01 K
1.01 K
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
434
395
暂无简介
Dart
987
253