可自定义图片指示器并支持自定义Tab宽度的TabLayout

本文介绍了如何自定义TabLayout,包括使用图片作为指示器和动态调整Tab的宽度。通过继承TabLayout并监听ViewPager滑动,实现图片指示器的绘制。此外,文章提供了两种方法来修改Tab宽度:一是利用反射修改内部final变量;二是异步修改TabView的参数。文章还解决了TabLayout中气泡显示完整的问题,并提供了完整的项目源码。
摘要由CSDN通过智能技术生成

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

Tab栏是APP中最常用的组件,如果我们没有太多个性化需求,直接用TabLayout就可以轻松实现。

但是如果我们的产品大大说不想用一条线作指示器了,想用个图片。或者像我们产品一样,想在主页展示4个半Tab(一共5个)时,原生TabLayout就不能满足了。

而前面我发过一篇,自定义三角下标的tablayout,来实现类似于今日头条tab效果,同时还有三角下标。

那时候我是继承HorizontalScrollView,但是滑动过程中有一些bug,因为要自己处理“什么时候该滑动”和“滑动多少”,后来在项目中逻辑太复杂,就想重新推翻重写一个。

当时也想过用TabLayout,但是TabLayout的滑动指示器是矩形,项目中要使用自定义图片,所以最开始就没继续思考,直接用了HorizontalScrollView。

现在回头想想,我真是傻,我直接继承TabLayout,把图片指示器画上去不就OK了,而且绘制图片指示器的逻辑跟自定义三角下标的tablayout一文里的逻辑一样!文末会贴上工程源码。

先看看这次的整体效果:

这里写图片描述

这里再简单说一下绘制三角下标的原理。

自定义图片指示器

  • 初始化指示器坐标:
 private void initTranslationParams(LinearLayout llTab, int screenWidth) {
        //mSlideIcon 是图片指示器
        if (mSlideIcon == null) {
            return;
        }
        tabWidth = (int) (screenWidth / (mTabVisibleCount + mLastTabVisibleRatio));
        View firstView = llTab.getChildAt(0);
        if (firstView != null) {
            //初始位置:第一个tab正下方
            this.mInitTranslationX = (firstView.getLeft() + tabWidth / 2 - this.mSlideIcon.getWidth() / 2);
            this.mInitTranslationY = (getBottom() - getTop() - 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值