一、核心信息
- 版本:1.7.0(第三方维护最终稳定版,官方最高 1.4.2)
- 包名:
net.lucode.hackware.magicindicator - 支持:ViewPager + ViewPager2
- 作用:顶部 Tab 指示器、滑动导航、文字动画、底部横线 / 圆角背景
二、依赖(必须正确)
1. app/build.gradle
gradle
implementation 'com.github.hackware1993:MagicIndicator:1.7.0'
2. 项目根目录 build.gradle 必须加仓库
gradle
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
三、XML 布局(通用)
xml
<net.lucode.hackware.magicindicator.MagicIndicator
android:id="@+id/magic_indicator"
android:layout_width="match_parent"
android:layout_height="48dp"/>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager2"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
四、最核心使用步骤(必背)
步骤 1:创建标题列表 + Fragment 列表
kotlin
val titles = listOf("首页", "旅拍", "视频", "我的")
val fragments = listOf(
HomeFragment(),
VideoFragment(),
TravelFragment(),
MineFragment()
)
步骤 2:给 ViewPager2 设置适配器
kotlin
viewPager2.adapter = object : FragmentStateAdapter(this) {
override fun getItemCount() = fragments.size
override fun createFragment(position: Int) = fragments[position]
}
步骤 3:初始化 MagicIndicator(最关键)
kotlin
val magicIndicator = findViewById<MagicIndicator>(R.id.magic_indicator)
// 1. 创建导航器
val navigator = CommonNavigator(this)
navigator.isAdjustMode = true // 自动居中,非常重要
// 2. 设置适配器
navigator.adapter = object : CommonNavigatorAdapter() {
override fun getCount(): Int = titles.size
// 3. 设置文字样式
override fun getTitleView(context: Context, index: Int): IPagerTitleView {
return ScaleTransitionPagerTitleView(context).apply {
text = titles[index]
normalColor = Color.GRAY // 未选中颜色
selectedColor = Color.RED // 选中颜色
textSize = 15f
minScale = 0.9f // 未选中缩放
}
}
// 4. 设置指示器样式(底部横线 / 圆角背景 / 圆点)
override fun getIndicator(): IPagerIndicator {
return RoundRectPagerIndicator(context).apply {
setColors(Color.RED)
roundRadius = 14f // 圆角
rectHeight = 28f // 背景高度
rectWidth = 58f // 背景宽度
}
}
}
// 5. 绑定
magicIndicator.navigator = navigator
magicIndicator.bindViewPager2(viewPager2) // 1.7.0 支持 ViewPager2
五、1.7.0 支持 5 种最常用指示器
你可以随便替换 getIndicator() 里的代码:
1. 圆角矩形指示器(APP 最常用)
kotlin
RoundRectPagerIndicator(context).apply {
setColors(Color.RED)
roundRadius = 14f
rectHeight = 28f
}
2. 底部直线指示器
kotlin
LinePagerIndicator(context).apply {
setColors(Color.RED)
lineHeight = 3f
mode = LinePagerIndicator.MODE_EXACTLY
}
3. 圆点指示器
kotlin
CirclePagerIndicator(context).apply {
setColors(Color.RED)
radius = 4f
space = 15f
}
4. 三角指示器
kotlin
TriangularPagerIndicator(context).apply {
setColor(Color.RED)
}
5. 全屏背景指示器
kotlin
BackgroundPagerIndicator(context).apply {
setColors(Color.parseColor("#F5F5F5"))
}
六、1.7.0 支持 4 种文字动画
替换 getTitleView 即可:
1. 颜色渐变(最稳)
kotlin
ColorTransitionPagerTitleView(context)
2. 缩放动画(最常用)
kotlin
ScaleTransitionPagerTitleView(context)
3. 翻转动画
kotlin
FlipPagerTitleView(context)
4. 渐变 + 缩放(效果最好)
kotlin
ScaleTransitionPagerTitleView(context)
七、1.7.0 新功能(非常好用)
1. 直接绑定 ViewPager2
kotlin
magicIndicator.bindViewPager2(viewPager2)
2. Tab 点击事件
kotlin
navigator.onTabClickListener = CommonNavigator.OnTabClickListener { index ->
viewPager2.currentItem = index
}
3. 自动居中(isAdjustMode = true)
kotlin
navigator.isAdjustMode = true
标题少的时候会自动居中,非常美观。
八、完整可复制示例(你项目直接用)
kotlin
val titles = listOf("首页", "旅拍", "视频", "我的")
val fragments = listOf(HomeFragment(), VideoFragment(), TravelFragment(), MineFragment())
viewPager2.adapter = object : FragmentStateAdapter(this) {
override fun getItemCount() = 4
override fun createFragment(position: Int) = fragments[position]
}
val navigator = CommonNavigator(this)
navigator.isAdjustMode = true
navigator.adapter = object : CommonNavigatorAdapter() {
override fun getCount() = titles.size
override fun getTitleView(context: Context, index: Int): IPagerTitleView {
return ScaleTransitionPagerTitleView(context).apply {
text = titles[index]
normalColor = Color.GRAY
selectedColor = Color.RED
textSize = 15f
}
}
override fun getIndicator(): IPagerIndicator {
return RoundRectPagerIndicator(context).apply {
setColors(Color.RED)
roundRadius = 14f
rectHeight = 28f
}
}
}
magicIndicator.navigator = navigator
magicIndicator.bindViewPager2(viewPager2)
九、最重要的 3 句话(背会)
- 1.7.0 是目前最稳定版本,支持 ViewPager2
- 布局只需要 MagicIndicator + ViewPager2
- 核心:Navigator + Adapter + TitleView + Indicator