源码解读android 5.0控件TabLayout无法自定义下划线宽度问题

来源:互联网 发布:感情 知乎 编辑:程序博客网 时间:2024/06/16 10:56

文章转载自:http://blog.csdn.net/baicai_12345/article/details/53522458

首先我要说的是TabLayout这个控件非常好用,随便搜索下网上一大堆的关于TabLayout的用法,因此我也就不具体介绍TabLayout的使用了。

这里我们谈谈为什么TabLayout无法自定义下划线宽度问题,废话不多说,上源码:
这里写图片描述
首先找遍源码,对于下划线也代指TabLayout的指示器只提供了颜色和高度2个属性并没有找到宽度的设置,当然setMode除外。

然后我们通过源码找到下划线的布局:
这里写图片描述

我们发现SlidingTabStrip类是private修饰的,这样就没办法重写了,当然你也可以用反射来写,不过这不在本次文章范围之内,

再来看SlidingTabStrip暴露给外部的三个方法:
这里写图片描述
分别为setSelectedIndicatorColor(int color),setSelectedIndicatorHeight(int height) ,以及getIndicatorPosition()这三个方法,开始已经提到过,这三个方法对于修改宽度没什么关系。所以也略过,现在让我们来看SlidingTabStrip的onMeasure方法,其中有2段核心代码分别为:
这里写图片描述

这里写图片描述

首先来看第一段代码,largesTabWidth的大小取得是自身和子布局宽度较大的一个,程序会执行全部的数量的tab控件从而获取最大控件的宽度,然后将largesTabWidth赋值,好了这段代码的作用结束。

我们来看第二段代码的作用,在执行第二段代码的时候,largesTabWidth的值已经是最大的情况,这时系统又一次的遍历了所有的控件,并且比较了宽度,如果宽度部位0或者跟largesTabWidth不等(其实就是比largesTabWidth小),这时候便会强行给每个下划线赋值为largesTabWidth的值,而到目前为止,下划线的宽度取值都是tab的宽度来控制的。

从上面我们就能看出悲催的下划线无法掌控自己的宽度,那么宽高测量完了,下面再来看看下划线移动时动画过程的布局绘制:
这里写图片描述

在draw方法里可以看到下划线的左右坐标分别为mIndicatorLeft和mIndicatorRight,这两个值怎么来的?一句话,上代码:
这里写图片描述
在setIndicatorPosition(int left, int right)方法中,我们看到了什么?没错!悲催的下划线左右坐标又被left 和 right强行赋值了。而left 和 right的则是所选项tab的左右坐标,在下划线移动过程中根据位移大小进行动态的赋值。

看了这么多代码我们发现下划线不管是移动过程还是原始绘制过程都被tab管的死死的,TabLayout不可以进行自定义的下划线宽度,虽然灵活性上面差了点,但是却能够保证稳定性。总的来说TabLayout还是不错的。

业余时间用反射写了个开源框架LuBus,主要用于项目模块间解耦,需要的朋友可以看看,github地址https://github.com/luying6/LubusDemo

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 调侃你的人怎么办 社会输了怎么办教案 社会输了怎么办反思 输了怎么办教案反思 大学体育考试不及格怎么办 大四体育挂科怎么办 大四体育没过怎么办 大二体育挂了怎么办 大学体育刚刚及格怎么办 大学体育课没选怎么办 大专挂科拿不到毕业证怎么办 大学专业课挂科怎么办 专科重修没过怎么办 大学毕业证没领怎么办 大一数学挂科怎么办 大学体育课挂了怎么办 大一考试挂科怎么办 一年级孩子考试不及格怎么办 孩子一年级数学不及格怎么办 一年级孩子考试紧张怎么办 健身动作不标准怎么办 足球赛踢平了怎么办 踢球指甲淤血了怎么办 初中一年级成绩差怎么办 着火了怎么办小班教案 小孩爱玩游戏怎么办 幼儿上学哭闹老师怎么办 孩子不喜欢上幼儿园怎么办 幼儿喜欢脱鞋怎么办 幼儿在教室乱跑怎么办 转学学校不接收怎么办 留守儿童成绩差怎么办 感冒鼻孑堵咳嗽哮喘怎么办 二年级数学报怎么办 不敢翻前滚翻怎么办啊 大学全挂了怎么办 幼儿园热了怎么办教案 幼儿园小班热了怎么办教案 高考艺术生色弱怎么办 雾眉后出现白棱怎么办 lol皮肤重复了怎么办