关于TabLayout的indicator宽度的一次探索

本文探讨了如何解决TabLayout的indicator宽度与Tab文字等宽的问题,通过反射设置Tab的Margin值、修改TabView的Margin以及自定义TabLayout源码来实现。详细介绍了三种方法的实现原理及效果,提供了Demo地址。
摘要由CSDN通过智能技术生成

本文的微信公众号链接:关于TabLayout的indicator宽度的一次探索

关于TabLayout,做过android开发的都知道,在android开发中应用特别广泛。这里来简单记录一下前不久遇到的关于TabLayout的一个问题。

先来看看下面一张图,

[外链图片转存失败(img-1dwBvvQQ-1569121977316)(https://raw.githubusercontent.com/JasonGaoH/Images/master/tablayout_1.png)]
这是我们app首页顶部的部分截图,典型的TabLayout的应用场景,现在遇到一个问题,设计需要TabLayout的indicator的宽度能够与Tab的文字等宽,甚至需要比文字的宽度短。

那么现在就需要想办法解决这个问题了,另外需要注意的是,这里的TabLayout是与ViewPager绑定的,需要兼容原来的TabLayout的的逻辑。

首先,想想能否在原生TabLayout的基础上,做一些调整。查看TabLayout的源码,我们发现TabLayout的有一个私有内部类SlidingTabStrip,这个SlidingTabLayout继承自LinearLayout,TabLayout的每个Tab的indicator就是由这个类负责绘制的。

SlidingTabStrip的draw方法
[外链图片转存失败(img-Q9BAdtL2-1569121977317)(https://raw.githubusercontent.com/JasonGaoH/Images/master/tablayout_0.png)]

可以看到,Tab的indicator的是SlidingTabStrip绘制的一个Rect,这个Rect的宽度是由IndicatorLeft和mIndicatorRight来决定的,看到上面截图的第一个箭头所指的地方,注意到这两行代码left = selectedTitle.getLeft(); right = selectedTitle.getRight();基本可以确定每个Indicator的宽度是和每个Tab的宽度确定的。所以,可以考虑针对这个特点做点调整。

第一种方法:通过反射设置TabLayout每个Tab的Margin值来实现压缩Tab的indicator宽度的效果。

链接地址:方法一

主要代码如下:

tabLayoutThree.post(new Runnable() {
            @Override
            public void run() {
                try {
                    Class<?> tablayout = tabLayoutThree.getClass();
                    Field tabStrip = tablayout.getDeclaredField("mTabStrip");
                    tabStri
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值