自定义TabLayout间隔:实战教你设置Tab间隔

6 下载量 132 浏览量 更新于2023-03-16 收藏 57KB PDF 举报
"这篇文章主要介绍了如何在Android开发中调整TabLayout中Tab之间的间隔,通过实例代码和背景选择器实现自定义间距。" 在Android开发中,TabLayout通常与ViewPager配合使用,提供一种易于管理和切换的界面布局。然而,TabLayout默认的样式和间隔可能无法满足所有设计需求,特别是当开发者想要自定义Tab之间的间距时。本文将详细介绍一种方法来解决这个问题。 首先,我们来看一下实现自定义Tab间隔的关键步骤。在XML布局文件中,我们可以设置TabLayout的属性来控制每个Tab的内边距,从而间接影响它们之间的间隔。例如: ```xml <android.support.design.widget.TabLayout xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/tl_download_tabs" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_marginTop="10dp" android:layout_gravity="center_horizontal" android:overScrollMode="never" app:tabMode="fixed" <!-- 设置Tab模式为固定 --> app:tabPaddingStart="30dp" <!-- 设置左侧内边距 --> app:tabPaddingEnd="30dp" <!-- 设置右侧内边距 --> app:tabIndicatorHeight="0dp" <!-- 隐藏指示器 --> app:tabBackground="@drawable/download_tab_bg_selector" <!-- 设置背景选择器 --> app:tabSelectedTextColor="#000000" <!-- 选中时文字颜色 --> app:tabTextColor="#ffffff"/> <!-- 默认文字颜色 --> ``` 这里,`app:tabPaddingStart` 和 `app:tabPaddingEnd` 属性用于设置Tab的左右内边距,实际上改变了Tab间的距离。请注意,这种方法仅能通过增大Tab自身的宽度来增加间隔,并不能直接设置两个Tab之间的绝对间距。 接下来,为了实现更复杂的间隔效果,我们可以通过创建一个背景选择器(Selector)XML文件来进一步定制。例如: ```xml <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true"> <!-- 选中状态的形状定义,可以设置不同的颜色、边框等 --> </item> <item android:state_focused="true"> <!-- 获得焦点状态的形状定义 --> </item> <item android:state_pressed="true"> <!-- 按下状态的形状定义 --> </item> <item> <!-- 默认状态的形状定义,可以在此添加间隔效果 --> </item> </selector> ``` 在默认状态下,我们可以在形状定义中加入空间或者使用自定义的图片资源来实现间隔。例如,可以创建一个带有空白区域的矩形形状,或者利用多个形状组合来达到间隔的效果。 总结来说,调整TabLayout中Tab的间隔,可以通过设置Tab的内边距和自定义背景选择器来实现。这允许开发者根据具体的设计需求,灵活地控制Tab之间的视觉效果和间距。需要注意的是,这种方法可能不适用于所有情况,因为TabLayout本身并不直接支持设置Tab间的绝对间隔。因此,开发者需要根据实际情况进行适配和调整。
2019-09-23 上传
最近接到一个任务,就是要修改原来用的官方support包TabLayout中的指示器线宽,改成固定值,当然网上有什么反射加padding什么的,可是治标不治本,切Tab过渡动画也加不了,什么?你告诉我github又xxx类似控件,可是为什么我要放弃google大神的源码呢,改改就能增加新功能了呢,为了达到目的,我就开始了下面一系列骚操作。0. 老规矩,先放效果图1. 骚操作之一:copy support包TabLayout 一份当做自己的自定义view本次骚操作是基于support '27.1.0'版本,从support '27.1.0'拷出文件到我的项目目录如下图,蓝色部分,四个文件,当然不是一帆风顺的,需要改点包名,取消掉一下注解警告,总之后面会放出源码 不同的版本可能需要拷贝出来的文件不一样哟,于support '27.1.0'版本需要拷出上图蓝色的4个文件2. 骚操作之二: fuck源代码,读懂之后开始改造首先指示器的线是画出来的,关键代码如下 (以下改动代码均为tabLayout类)   canvas.drawRect(mIndicatorLeft, getHeight() - mSelectedIndicatorHeight,                             mIndicatorRight, getHeight(), mSelectedIndicatorPaint);OK, mIndicatorLeft是滚动或者点击切tab时候通过偏移量计算出来的,总之不重要,完成第一个目标。修改指示器线宽,思路呢,就是给mIndicatorLeft和mIndicatorRight做一个偏移量就行了, 看看我怎么改的吧其中2个成员变量是我在SlidingTabStrip类中新增的 private int mSelectedIndicatorWidth =  dpToPx(27);;         private int mMinTabWidth = Integer.MAX_VALUE;我这里偷懒一下就不做方法暴露了,直接写死了线宽为27dp了好了,已经完成修改线宽目标了。(扩展一下:这里你也可以修改draw方法,画个图,或者画个小圆圈什么的)接下来增加指示线滑动切tab的过渡动画很简单我就放代码吧,关键就是在onPageScrolled方法里面做点手脚总共改动就50来行吧,就达成效果了。是不是很简单。(简单才怪,总之做出来之后觉得确实蛮简单的) 这样改好处多多,为什么呢?xml基本不需要改变,tablayout名字改一下,代码也是导包改一下,替换官方tablayout的时候代码几乎不需要变化,是不是很爽?3. github下载,喜欢就给个star吧,如果对你有帮助的话https://github.com/zjw-swun/AppOrder4. 总结官方support包就是可以这么任性的拷贝出来,有时候一个拷出一个类根本没涉及到别的类,善假于物也。