TabLayout自定义指示器及样式

一,自定义指示器下标

效果图如下:
在这里插入图片描述

1,新建一个名为:layer_tab_indicator的layer-list文件,然后定义想要的样式,其中bitmap 设置成需要的图片格式,也可以根据需求在item标签内添加绘制所需要的下标

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:width="23dp"
        android:height="6dp"
        android:gravity="center">
        <bitmap android:src="@drawable/tab_bottom_tag"/>
    </item>
</layer-list>

2,给TabLayout添加自定义的layer-list

app:tabIndicator="@drawable/layer_tab_indicator"

通过如上两步即可完成自定义TabLayout的指示器样式,如果更加复杂的,可参考其他的进行自定义,使用如上方法即可满足大部分的需求

二,自定义Tab样式

1,给TabLayout添加选中的监听

private fun getTabSelectedListener() = object : TabLayout.OnTabSelectedListener {
    override fun onTabSelected(tab: TabLayout.Tab?) {
        //Tab选中的样式
        setTab(tab)
    }

    override fun onTabUnselected(tab: TabLayout.Tab?) {
        //非选中时的样式
        tab?.customView = null
    }

    override fun onTabReselected(p0: TabLayout.Tab?) {

    }
}

2,自定义选中的Tab样式

fun setTab(tab: TabLayout.Tab?) {
    val textView = TextView(activity)
    //字体样式
    val selectedSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20f, resources.displayMetrics)
    textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, selectedSize)
    textView.typeface = Typeface.defaultFromStyle(Typeface.BOLD) //加粗
    textView.gravity = Gravity.CENTER
    //选中的字体颜色
    textView.setTextColor(ContextCompat.getColor(activity!!, R.color.main_color))
    textView.text = tab!!.text
    tab.customView = textView
}

因TaLayout已经预留了一个customView根据自己的需求进行扩展,通过如上的onTabSelected和onTabUnselected进行自定义选中和未选中的样式

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
最近接到一个任务,就是要修改原来用的官方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包就是可以这么任性的拷贝出来,有时候一个拷出一个类根本没涉及到别的类,善假于物也。
Tab的标题如何修改?有哪些方法可以修改Tab的标题? 回答:要修改TabLayout中Tab的标题,可以使用以下几种方法。如果使用的是原生的Tab,可以通过`nViewDataBinding.tabTodo.getTab(0).setText("");`来修改指定Tab的标题。\[1\]如果使用了自定义的Tab,使用`tab.setText("新标题")`来修改Tab的标题是无效的。在这种情况下,可以通过设置自定义的View来实现修改标题。首先,创建一个包含标题的List,然后使用循环为每个Tab设置标题和自定义View,如下所示: ``` List<String> titleList = new ArrayList<>(); titleList.add("今日"); titleList.add("本周"); titleList.add("本月"); titleList.add("本季"); for (int i = 0; i < titleList.size(); i++) { TabLayout.Tab tab = nViewDataBinding.tabTodo.newTab(); tab.setText(titleList.get(i)); tab.setCustomView(getTodoTabView(titleList.get(i), 14)); nViewDataBinding.tabTodo.addTab(tab); } ``` 这样就可以通过设置自定义View的方式修改Tab的标题了。\[2\]另外,如果想修改TabItem的字体大小,可以使用`app:tabTextAppearance="@style/kd_enet_TabLayoutTextStyle"`来设置样式,然后在样式中设置字体大小,如下所示: ``` <style name="kd_enet_TabLayoutTextStyle"> <item name="android:textSize">16sp</item> <!--<item name="android:textStyle">bold</item>--> </style> ``` 通过设置样式中的`android:textSize`属性,可以修改TabItem的字体大小。\[3\] #### 引用[.reference_title] - *1* *2* *3* [TabLayout自定义总结](https://blog.csdn.net/zhijiandedaima/article/details/113363708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值