SpannableString字体大小自适应

本文介绍了一种解决SpannableString在TextView中自适应显示的问题,通过使用RelativeSizeSpan替代AbsoluteSizeSpan,实现了根据TextView可用宽度动态调整字体大小的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

最近修复一个bug时遇到一个问题, TextView中显示的是SpannableString, 原有项目中自定义TextView是通过二分法找到一个合适的TextView能将字体完全展示的TextSize, 但是通过AbsoluteSizeSpan给SpannableString设置的字体大小是不受到TextView的textSize属性影响的,所以SpannableString的自适应需要有一套单独的方式.

实现

开始收到思路局限一直想使用和普通String相同的思路, 通过计算不同字体所需要的显示宽度,动态设置字体大小, 但是获取SpannableString的属性是个相对比较麻烦的工作, 而且这种方式使用场景受到局限,不能适用只有部分文字(或者所有文字都不设置AbsoluteSizeSpan)的情况.
通过查Android api发现设置SpannableString的字体除了AbsoluteSizeSpan外还有个RelativeSizeSpan, 从字面上理解,一个是绝对大小, 一个是相对大小, 有了这个设置相对大小的方法就简单多了, 可以通过可用宽度(TextView能显示的宽度)和所需宽度(显示当前大小所需要的宽度)计算出缩放比例, 关键代码如下:

private void refitSpannableString(CharSequence text, int width) {
    if (width > 0) {
        SpannableString targetString = new SpannableString(text);
        int availableWidth = width - getPaddingLeft() - getPaddingRight();
        float desiredWidth = Layout.getDesiredWidth(targetString, getPaint());
        //text所需宽度>TextView可用宽度,并且TextView字体大小>设置的最小字体,才会重新设置字体大小
        if (desiredWidth > availableWidth && getTextSize() > getMinTextSize()) {
            float scale = availableWidth / desiredWidth;
            //缩放后的字体不能小于设置的最小字体
            if (getTextSize() * scale < getMinTextSize()) {
                scale = getMinTextSize() / getTextSize();
                setTextSize(mMinTextSize);
            }
            targetString.setSpan(new RelativeSizeSpan(scale),
                    0, targetString.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);
            setText(targetString);
        }
    }
}

自定义TextView代码:https://download.youkuaiyun.com/download/qq_30496695/10889594

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值