TabLayout 选中改变字体大小颜色、指示线

Android TabLayout 选中改变字体大小颜色、指示线
1 思路分析
在本次项目中,交互设计要求实现 TabLayout 的点击效果,包括字体大小、颜色、指示线的样式等效果。


2 实现思路
2.1改变 tab 字体大小、颜色
我希望在代码中实现这个效果。首先在 colors.xml添加点击前后的颜色值:

  <color name="home_tab_selected">#303233</color>
  <color name="home_tab_unselected">#A2A2A2</color>



然后为 TabLayout 设置 addOnTabSelectedListener事件,监听 tab 选择状态的改变,从而改变 tab 字体的颜色和大小:

tabLayout.addOnTabSelectedListener(new TabLayout.BaseOnTabSelectedListener() {
  @Override
  public void onTabSelected(TabLayout.Tab tab) {
    String type = tab.getText().toString();
    EventBus.getDefault().post(new LoginEvent(type));

    // 获取 tab 组件
    View view = tab.getCustomView();
    if (null != view && view instanceof TextView) {
      // 改变 tab 选择状态下的字体大小
      ((TextView) view).setTextSize(22);
      // 改变 tab 选择状态下的字体颜色
      ((TextView) view).setTextColor(ContextCompat.getColor(getContext(), R.color.home_tab_selected));
    }

  }

  @Override
  public void onTabUnselected(TabLayout.Tab tab) {
    View view = tab.getCustomView();
    if (null != view && view instanceof TextView) {
      // 改变 tab 未选择状态下的字体大小
      ((TextView) view).setTextSize(18);
      // 改变 tab 未选择状态下的字体颜色
      ((TextView) view).setTextColor(ContextCompat.getColor(getContext(), R.color.home_tab_unselected));
    }

  }

  @Override
  public void onTabReselected(TabLayout.Tab tab) {

  }
};


2.2 改变 tab 指示线
我们要实现 tab 选择时指示线的圆角+长度修改+颜色修改效果,但是Tablayout 原生只提供了改变指示线颜色的方法,而没有提供修改指示线长度、圆角等样式的方法,远不能满足我们的需求。网络上的教程多数也是使用反射实现的,个人感觉比较繁琐。

因此,这里采用了 一种替换背景实现指示线样式修改的方法。

隐藏 TabLayout 原生的 tabIndicator

 <android.support.design.widget.TabLayout
     ...
     app:tabIndicatorHeight="0dp"
     ...
/>


替换 tabBackground

 <android.support.design.widget.TabLayout
     ...
     app:tabBackground="@drawable/tab_selector"
     ...
/>


selector 代码如下

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/tab_selected" android:state_selected="true" />
    <item android:drawable="@color/white" />
</selector>


其中的选中 tab_selected 代码

<?xml version="1.0" encoding="UTF-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 整个背景色-->
    <item>
        <shape>
            <solid android:color="@color/white" />
        </shape>
    </item>
    <!-- 底部圆角,参数是固定的 -->
    <item
        android:width="20dp"
        android:height="3dp"
        android:gravity="bottom|center_horizontal">
        <shape>
            <solid android:color="@color/colorPrimary" />
            <corners android:radius="3dp" />
        </shape>
    </item>
</layer-list>


很好理解,就是当 tab 被选中时替换背景为自定义的圆角+颜色+长度的背景,未选中时则替换为白色背景,很好地实现了这种效果。

扫描二维码关注公众号,回复: 8972366 查看本文章
发布了54 篇原创文章 · 获赞 20 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/csdn15002274757/article/details/102625732