如何在4.X版本实现Switch在5.X的效果

如何在4.X版本实现Switch在5.X的效果

前言

这个需求可能不多,不过本篇博客主旨是希望能通过记录实现这个需求的过程,给同学们一些解决问题的思路。

简单描述需求

首先应用是跑在4.4的系统上的,然后设计师大人设计了一个效果,如下图:

图片1这里写图片描述

但是在4.X的版本是这样的,如图

图片2这里写图片描述

我自定义的结果是介于两者之间,如图

图片3这里写图片描述


然后我就开始各种百度。。。结果还真是让人悲伤,大家的文章基本上都是定义thumb和track来实现如下图的样式:

图片4这里写图片描述

显然这不能满足我们的设计需求。百度无果,也不能说做不了(毕竟我也是脸皮薄(偷笑)),然后就想既然5.X可以实现,那就看看源码啦。

下面是重要源码分析

首先我这是宽度不够,就是设计图是一个圆形图标,但是我的是一个长条

    private int mThumbWidth;//这个是上面滑块的宽度,因为我的滑块是长条,所以我在这里入手,看看这个宽度是怎么计算来的
//然后一搜就到了这个菊花,mThumbWidth是取得maxTextWidth和thumbWidth中较大值
   mThumbWidth = Math.max(maxTextWidth, thumbWidth);
//再去找这两个宽度哪里来的,这里赋值,然后发现maxTextWidth是mOnLayout.getWidth()和mOffLayout.getWidth()中较大的值,还有mThumbTextPadding*2(就是左右两面的padding)
 final int maxTextWidth;
        if (mShowText) {
            maxTextWidth = Math.max(mOnLayout.getWidth(), mOffLayout.getWidth())
                    + mThumbTextPadding * 2;
        } else {
            maxTextWidth = 0;
        }
//下面继续找mOnLayout和mOffLayout了,这两个值来自于mTextOn和mTextOff
if (mShowText) {
            if (mOnLayout == null) {
                mOnLayout = makeLayout(mTextOn);
            }

            if (mOffLayout == null) {
                mOffLayout = makeLayout(mTextOff);
            }
        }
//mTextOn和mTextOff,终于到这里了,其实就是我们设置的文字了,通过如下两个属性 android:textOff=""和android:textOn=""
mTextOn = a.getText(com.android.internal.R.styleable.Switch_textOn);
        mTextOff = a.getText(com.android.internal.R.styleable.Switch_textOff);

解决方案1

既然这个文字可以影响的话,那就简单啦,多写几个空格不就好了,这里就得到解决方案了。

继续源码分析

上面我们还有一个参数也是可以影响到最终的mThumbWidth的,还记得么?没错就是mThumbTextPadding啦,字面意思很好理解吧,就是文字的padding值了,下面看看源码啦

//只是一个属性啊,这就简单了,其实对应的就是android:thumbTextPadding=""

mThumbTextPadding = a.getDimensionPixelSize(
                com.android.internal.R.styleable.Switch_thumbTextPadding, 0);

解决方案2

这就不多说了,简单设置一下就行了啊。

总结

这里主要是介绍一种解决问题的方式,问题滑块宽度不够—>去源码中看哪些值影响—>设置可影响的值—>达到目的

这也鼓励大家多看源码,难度大的看不懂,可以从简单的入手,无论如何,这也是进入高级开发的一个必经路,—–在此共勉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值