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 开发中分页指示器的首选解决方案。立即尝试,为你的应用添加专业级的分页指示效果!
💡 提示: 在实际项目中使用时,建议始终使用最新版本以获得最佳的性能和最新的功能特性。
登录后查看全文
热门项目推荐
相关项目推荐
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
521
3.71 K
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
12
1
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
67
20
暂无简介
Dart
762
184
喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
23
0
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.32 K
742
无需学习 Kubernetes 的容器平台,在 Kubernetes 上构建、部署、组装和管理应用,无需 K8s 专业知识,全流程图形化管理
Go
16
1
React Native鸿蒙化仓库
JavaScript
302
349
基于golang开发的网关。具有各种插件,可以自行扩展,即插即用。此外,它可以快速帮助企业管理API服务,提高API服务的稳定性和安全性。
Go
22
1