设计图如下:

方法一 XML设置Indicator的宽度

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:width="12dp"android:height="3dp"android:gravity="center_horizontal"><shape><solid android:color="@color/white" /></shape></item>
</layer-list>

不过有API要求23起,不过我们最低target是21,不管了。

如果实在要兼容更低版本,可以定义一个默认的xml和一个v23的xml来实现对低版本的兼容,低版本由于没有height和width,考虑设置left和right来达到对indicator宽度的限制。

例如:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:left="25dp"android:right="25dp"android:gravity="center_horizontal"><shape><solid android:color="@color/white" /></shape></item>
</layer-list>

使用:app:tabIndicator="@drawable/tab_indicator"

方法二 反射设置Indicator宽度

internal class TabIndicatorRectF(private val indicatorBoundsModifier: IndicatorBoundsModifier) : RectF(), Serializable {private val temp: RectF = RectF()interface IndicatorBoundsModifier {fun modify(bounds: RectF?)}override fun set(left: Float, top: Float, right: Float, bottom: Float) {temp.set(left, top, right, bottom)indicatorBoundsModifier.modify(temp)super.set(temp)}fun replaceBoundsRectF(tabLayout: TabLayout?) {try {val field: Field = TabLayout::class.java.getDeclaredField("tabViewContentBounds")field.isAccessible = truefield.set(tabLayout, this)} catch (e: NoSuchFieldException) {e.printStackTrace()} catch (e: IllegalAccessException) {e.printStackTrace()}}class FixedWidthModifier(width: Float) : IndicatorBoundsModifier {private val halfWidth = abs(width) / 2override fun modify(bounds: RectF?) {bounds?.centerX()?.let {bounds.left = it - halfWidthbounds.right = it + halfWidth}}}
}

调用:

TabIndicatorRectF(TabIndicatorRectF.FixedWidthModifier(DisplayUtil.dip2px(12f))).replaceBoundsRectF(toolbarFuncBinding.tabLayout)

方法三 使用第三方库实现:MageicIndictor

方法四:自定义Indictor

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><item android:gravity="center"><shape><sizeandroid:width="12dp"android:height="4dp" /><solid android:color="@color/color_333" /></shape></item></layer-list>
<com.google.android.material.tabs.TabLayoutandroid:id="@+id/tab_layout"android:layout_width="match_parent"android:layout_height="40dp"app:tabIndicatorFullWidth="false"app:tabMode="fixed"app:tabIndicatorGravity="bottom"app:tabGravity="center"app:tabIndicator="@drawable/tab_indicator_black"app:tabIndicatorColor="@color/color_333"/>

所以我采用的是方法四,本来想考虑方法三点,但是项目没有引用到MagicIndictor,所以就不考虑了。

部分参考自:https://cloud.tencent.com/developer/article/1460300

TabLayout的Indicator自定义宽度相关推荐

  1. [Android]Tablayout:修改指示器indicator的宽度

    一.问题描述: 最近接触到了Tablayout,需求是要把Tablayout的下划线宽度缩短,或者说使其可以进行自定宽度. 百度上面大多数利用反射,(具体可百度查询),这种方法确实可以把下划线变短,但 ...

  2. ViewPager Indicator 自定义标题和指示器样式

    ViewPager Indicator 自定义标题和指示器样式 Indicator 自定义样式 可支持自定义内容 使用方式 1.xml中直接引用 2.绑定ViewPager 3.自定义样式实现和修改 ...

  3. TabLayout设置指示器的宽度

    TabLayout的指示器的高度.颜色都可以设置,但是宽度需要自己来实现 在TabLayout view初始化后,设置 /** * @date:2017/11/9/009 * @author:平sir ...

  4. vue table使用colgroup进行表格自定义宽度

    vue table使用colgroup进行表格自定义宽度 在默认情况下table表格的宽度是根据表格内容进行分配的 想自定义宽度可以通过colgroup标签配合col标签设置: col的个数与表格的列 ...

  5. 一个工具类实现自定义Tablayout的下划线宽度

    ** 只改变Tablayout的下划线的宽度,只需要一个工具类就可以可满足** 1.写个工具类 封装: /*** @author FX* @date 2018/07/19 11:11* @fuctio ...

  6. zxing生成边框自定义宽度二维码,

    1.基本方法 //二维码容错率,分四个等级:H.L .M. Q ErrorCorrectionLevel level = ErrorCorrectionLevel.H; String qrName = ...

  7. 自定义FlowLayout控件实现自定义宽度并换行

    最近的需求是实现添加购物车页面,展示规格的时候会出现显示不全,数据会自动剪切掉,后边重新自定义了FlowLayout问题得到解决,下面直接上代码 public class FlowLayoutView ...

  8. 仿掌阅实现 TabLayout 切换时的字体和 Indicator 动画

    文章目录 前言 分析 实现字体缩放动画 实现 Indicator 的长度变化动画 一.准备工作 二.让 TextView 撑满 TabView 三.实现滑动时 Indicator 的动画效果 写在最后 ...

  9. [Android] TabLayout设置下划线(Indicator)宽度

    在使用TabLayout的过程中,为每个标签添加一个 下划线,但发现每个下划线的 宽度 都是一样的,例如会如下显示 这样很难看,所以必须进行调整后的效果如下: 看,这样不是非常和谐啦!~~ 实现方法很 ...

  10. 自定义TabLayout

    前言 系统自带的Tablayout用的也不错但是有些功能还不能满足我们这边开发,所以我这边自定义了一个tablayout提供了自定义tab线的长度以及,移动速度,以及禁止某个滑动(tablayout基 ...

最新文章

  1. mysql里条件语句和循环语句_MySQL与Oracle 差异比较之四条件循环语句
  2. java volatile 多线程,java多线程-volatile的使用
  3. via浏览器下载路径_Via - 能够安装脚本插件的安卓浏览器
  4. Mestasploit 客户端渗透
  5. [Ynoi2018]末日时在做什么?有没有空?可以来拯救吗?
  6. 不愿意和别人打交道_最不愿与陌生人打交道的星座
  7. python安装scipy出现红字_windows下安装numpy,scipy遇到的问题总结
  8. [转载] python3 opencv 图像二值化笔记(cv2.adaptiveThreshold)
  9. 数据预处理—3.变量选择之逐步挑选—向前挑选、向后挑选、双向挑选python实现
  10. python离线录音转文字软件_有能把录音变成文字的软件么?
  11. 一键采集淘宝店铺装修模板图
  12. Please change your current directory to a writable directory outside of the MATLAB installation area
  13. linux中man手册用法,Linux中man手册的使用
  14. Hbase——练习4
  15. 在线计算机励志文案,21句让人心动的励志文案,振奋人心,激励满满!
  16. Python3+Scrapy通过代理爬取携程酒店数据
  17. 微软发布命令行神器,文件误删秒恢复
  18. android 图片方法,分享实现Android图片选择的两种方式
  19. ABM410-ASEMI贴片整流桥ABM410
  20. 萌新必看——10种客户端存储哪家强,一文读尽!

热门文章

  1. 牛客小白月赛21 I题
  2. Ajax中readyState和status
  3. 第四届橙瓜网络文学奖20年十佳言情大神天下归元暂时排第三名
  4. 高等数学(第七版)同济大学 习题7-4 个人解答
  5. 冲击港交所:百果园书写水果连锁运营默示录
  6. 谷歌colab平台简单使用及读取自己的数据集
  7. git push出现 remote: Support for password authentication was removed on August 13, 2021.
  8. 中国混合现实产业调研分析及发展战略研究报告2021-2027年版
  9. Linux 工具链 error while loading shared libraries: libgettextsrc-0.19.8.1.so 解决方法
  10. makefile写法整理