Android: 实现自定义下划线滚动/样式 TabLayout/Animation

b( ̄▽ ̄)d 每日从需求学习新知识之《TabLayout实现下划线滚动》

需求描述

需要从原来的普通点击高亮下划线变更为点击下划线具有滚动效果
like this :
在这里插入图片描述

设计思路

Animation

因为项目原本的布局是Button,并不想修改原来的布局,所以我的设计思路是放个ImageView做下划线动画,点哪移哪,具体实施为写死X轴做平移动画(因为是车载固定位置,其他慎用)。然后找另外一个界面的大哥同步

    private void moveIndicator(int targetX, int originalX) {
        Log.d(TAG, "moveIndicator originalX: " + originalX + " targetX: " + targetX);
        //参数设置原始XY轴位置以及目标XY轴位置
        Animation animation = new TranslateAnimation(originalX, targetX, 0, 0);
        animation.setFillAfter(true);
        animation.setDuration(500);
        indicator_ll.startAnimation(animation);
    }

开发前辈👨:“会不会太复杂(ruozhi)了,用tabLayout就行”

/(ㄒoㄒ)/~~ 虽然已经用低级的方法实现了但还是选择适配一下tabLayout

TabLayout

先总结一下被坑点
① sdk版本过低 使用TabLayout 无法自定义下划线(自定义导致滚动失效)
② 使用 TabLayout 字体大小失效(大小不一)

(一)初见

由于项目sdk为27,甚至无法添加这个依赖

implementation 'com.google.android.material:material:1.1.0'

在面向百度编程后,了解到必须升级到sdk28之后才能使用,但升级项目版本呢是不可能的,于是找到了另外一种可以支持sdk27使用的(以为是好的开始结果是深渊)

implementation 'com.android.support:design:27.0.0'

但使用时会出现报错信息:
Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

解决方案:https://lizhong.blog.csdn.net/article/details/92978943

(二)又见

当引入依赖写了几个简单布局发现可以实施滚动效果之后,我就决定先把对应的逻辑代码一起改了适配,但UI给的效果图下划线是圆角的,天真的我想着方变圆能有多难啊!还是先把逻辑改了吧。
此处遇到一个文字大小不一的问题,具体解决方案为设置tabLayout的内边距为0或者负数
原理参考:https://www.jianshu.com/p/2375c27613dd

    <style name="tabLayout_item">
        <item name="tabPaddingStart">-5dp</item>
        <item name="tabPaddingEnd">-5dp</item>
    </style>
    <android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    style="@style/tabLayout_item"
    android:layout_width="600px"
    android:layout_height="84px"
    app:tabGravity="fill"
    app:tabIndicatorColor="@color/blue77"
    app:tabIndicatorHeight="4px"
    app:tabMinWidth="200px"></android.support.design.widget.TabLayou>

(三)不见

终于到最后一步:把下划线换成圆角,只需要写好对应的样式,添加以下属性

        app:tabIndicator="@drawable/xxx"

然鹅
为什么没有 tabIndicator 属性啊!?Σ(っ °Д °;)っ
我只能找到以下两个有关于修改indicator的属性,第一个是颜色,第二个是高度

    <app:tabIndicatorColor="@color/blue77"-->
    <app:tabIndicatorHeight="4px"-->

查阅资料后发现只有sdk28版本之后的支持自定义indicator样式
那真的没有办法了吗! ヽ(*。>Д<)o゜
—— 是的,没办法了(反正我是没办法了)想低版本实现的不用往后看了,如果有方法的朋友可以一起讨论一下

(四)爱见不见

在发现没有办法设置indicator样式之后我还在持续的做无用功

到底是为什么一条横线方变圆会那么难 (╯°□°)╯︵ ┻━┻

肯定有办法不升级sdk又能设置indicator样式的!我这样安慰自己┳━┳ ノ( ゜-゜ノ)

在网上查阅的资料里,无一例外的都需要设置tabIndicator去定义下划线的样式
但因为sdk版本问题,我无法设置这个属性 已经想开摆了( ̄_ ̄|||)

 app:tabIndicator="@drawable/xxx"

或者是

mTabalyout.setSelectedTabIndicator()

然后我找到了一篇利用反射的方式设置Indicator宽度的文章

既然可以设置indicator的宽度,那自然设置个样式也不难吧!于是我学着大佬的模样打开了源码,一人一杯茶一下午,拿到的属性都只能对TabView做操作,那方方的下划线是雷打不动。我恨自己不看完文章就贸然实施 ( ̄ ‘i  ̄;)

源码分析:https://www.jianshu.com/p/83922d08250b

Indicator的宽度决定于TabView的宽度,而TabView的宽由其中的TextView决定,实质上其实是在对TextView做操作,跟下划线是一点关系没有啊!

(五)下次再见

有其他方法可以自定义下划线样式,但会使下划线滚动失效
可我就是想要滚动的效果啊不然干嘛换TabLayout (╯‵□′)╯︵┻━┻

但由于暂时没辙了所以先告一段落,恢复了最开始鸡肋的实施

放几个允许更换sdk版本的情况下的实施参考:
https://juejin.cn/post/6844903860587200526
https://blog.csdn.net/YX_BB/article/details/105925368

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值