背景

最近修复一个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.csdn.net/download/qq_30496695/10889594

SpannableString字体大小自适应相关推荐

  1. 字体大小自适应屏幕分辨率 CSS解决方案

    字体大小自适应屏幕分辨率 CSS解决方案 参考文章: (1)字体大小自适应屏幕分辨率 CSS解决方案 (2)https://www.cnblogs.com/love0618/p/4020752.htm ...

  2. HTML设置字体大小自适应屏幕与echarts图表颜色根据数据大小实时刷新图表颜色

    设置html文字大小根据页面大小自适应,在使用rem之前是使用的px和百分比,后来发现页面缩放或在小屏幕的电脑显示不尽人意,后改用rem,写法如:font-size: .21rem;或font-siz ...

  3. 使用rem,使字体大小自适应屏幕

    rem是CSS3新增的一个相对单位(root em,根em).这个单位与em区别在于使用rem为元素设 定字体大小时,仍然是相对大小,但相对的只是HTML根元素.这个单位可谓集相对大小和绝对大小的优点 ...

  4. 使用阿里云的oss对图片加水印并且字体大小自适应(阿里云oss暂不支持字体大小自适应)

    使用阿里云的oss对图片加水印并且字体大小自适应(阿里云oss暂不支持字体大小自适应) 背景: 首先阿里云oss云对象存储是不能做到字体大小自适应的,因为在开发中我们的图片上传的尺寸是做不到固定大小宽 ...

  5. pyqt5标签中的字设置不同字体_PyQt5 实现字体大小自适应分辨率的方法

    最近遇到一个现象,将做好的软件放在更高分辨率的电脑上运行,会导致字体显示不完全,出现被控件遮挡的情况.具体原因可以上网查询,在这里将记录下解决方法. 这里记录两种方法,如果使用的Qt版本在5.6.0之 ...

  6. js设置字体大小自适应屏幕分辨率

    js可以通过 screen.width获取屏幕分辨率的大小. var conf_div = document.createElement('div'); //创建div conf_div.style. ...

  7. html 字号自适应,html自适应网页里字体大小自适应屏幕的方法

    html自适应网页里字体大小自适应屏幕的方法 发布时间:2020-11-20 16:40:22 来源:亿速云 阅读:216 作者:小新 这篇文章主要介绍了html自适应网页里字体大小自适应屏幕的方法, ...

  8. echarts-折线图-echarts字体大小自适应

    <template><div><div><!--为echarts准备一个具备大小的容器dom--><div id="org_ech_li ...

  9. html5纯css字体大小自适应设置

    css 字体大小自适应样式设置篇 字体可以设置大小使用css font-size来实现,有时需要对字体大小根据浏览器分辨率来判断后自适应大小. 在CSS 2.0中字体大小自适应是难实现的,一般使用JS ...

最新文章

  1. 你有没有想过: 为什么Java中String是不可变的?
  2. Java基础(三)面向对象(下)
  3. 产品管理职位的级别都有哪些
  4. background image
  5. SunnyOS准备4
  6. react-踩坑记录——swiper报错!
  7. DPDK - TX-Offload Checksum
  8. CCF 2022:DPU评测技术白皮书发布【附白皮书下载】
  9. vue中使用ue编辑器的一些简易说明
  10. django数据库迁移
  11. 树莓派+USB免驱摄像头远程监控
  12. ISBN(国际标准书号)
  13. deadmau5 《光之塔》 NFT 系列来袭!
  14. wordpress图像大小_如何在WordPress中添加图像积分(逐步操作)
  15. 2019 CSS经典面试题(史上最全,持续更新中...)
  16. 【游戏设计模式】之三 状态模式、有限状态机 Unity版本实现
  17. AQS抽象队列同步器原理详解
  18. Unity两种获取屏幕点击位置的世界坐标方法
  19. 红旗linux怎么升级,[原]使用yum更新红旗Linux
  20. 孕妇php是什么意思,关于孕妇

热门文章

  1. 无线网络CSMA/CA原理分析以及相关技术的介绍和分析
  2. jQuery轮播图(详细注释)
  3. 自学用——html+css(要点)
  4. VB中ByVal和ByRef
  5. 中值滤波Median filtering
  6. C++与C#相比,哪个更适合开发大型游戏?
  7. 世界正游弋于开源之海,但只有 Red Hat 从中盈利
  8. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构
  9. echarts-liquidfill 水滴图/水位图/水球 下载地址
  10. linux临时配置mac地址,Linux获取网卡型号、mac地址、修改IP地址的几种方法