需求:根据文字长度自动缩小文字大小

最近做项目遇到一个场景,在做类似淘宝选择商品数量的页面,点“+”数字增,点“-”数字减,想到一个问题,布局样式固定,暂时不做可输入数量,只能通过加减号变更数量,文本宽度固定,如果真的有人一直点加号,文字宽度大于了实际控件的宽度,能不能让文字自动缩小

虽然Android有AppCompatTextView已经有这种效果,但是仅限于8.0及以上系统,难道做的软件只能允许Android8.0系统以上的手机能用??这显然不行!!!

于是,自定义吧,虽然网上搜一下,也有类似的博文,但是发现是不是有点复杂,于是,整理一下思路:

  1. 文字不超过TextView宽度不用进行缩放
  2. 为了两边留有一定间隔,当文本宽度大于TextView宽度-左右间隔时,开始缩放
  3. 缩放比例如何计算??其实很简单,文本宽度/(TextView宽度-左右间隔)即可
  4. 比例计算好,设置字体大小即可

文本宽度的计算,在网上有篇文章“关于 Android 测量文字宽度的方法”,我是通过百度快照进去看的,因为现在博客园改成必须注册用户才可看,有点恶心。
文中讲到两点:

1、测量绝对文本的长度
2、测量相对文本的长度
什么是绝对文本呢?
就是指那些字号、字体、粗细等属性不受在所运行的硬件设备上的 Android 系统的配置所影响文本。例如:自定义View时通过Canvas绘制出来的文本;
而相对文本在使用上就广泛很多了。例如直接用 TextView 展示的文本、网页上的文本、手机短信内容文本等。相对文本在字号、字体、粗细程度上除了受应用开发时的配置影响以外还会间接地受到系统设置的影响。例如在 Android 的系统设置 – 显示 – 字体大小 中的配置就会间接地影响到相对文本的显示效果。

绝对长度:通过paint.measureText(txt);获得

相对长度:通过Layout.getDesiredWidth(text.toString(), 0, text.length(), textPaint);获得

我这里采用相对长度。
上代码

import android.content.Context
import android.graphics.Canvas
import android.text.Layout
import android.text.TextPaint
import android.util.AttributeSet
import android.util.TypedValue
import androidx.appcompat.widget.AppCompatTextViewclass AutoScaleTextView : AppCompatTextView{private var textPaint: TextPaint = paintprivate var txtSize: Floatconstructor(context: Context?) : this(context,null)constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs,0)constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context,attrs,defStyleAttr){txtSize = textPaint.textSize}override fun onDraw(canvas: Canvas?) {super.onDraw(canvas)canvas?.let {if(text.isNotEmpty()){//绝对文本大小,字号、字体、粗细等属性不受在所运行的硬件设备上的 Android 系统的配置所影响文本//float length = getPaint().measureText(content.toString());//相对大小,受上述属性影响val txtLen = Layout.getDesiredWidth(text.toString(),0,text.length,textPaint)if(txtLen>width-10){//当字体长度大于宽度-10的时候,按比例缩放val scale = width/txtLensetTextSize(TypedValue.COMPLEX_UNIT_PX,txtSize*scale)}else{setTextSize(TypedValue.COMPLEX_UNIT_PX,txtSize)}}}}
}

效果如下
初始:

长文本:

这就结束了,没有添加任何新的属性,TextView平时怎么使用还怎么使用!
贴一段布局中的示例,修改text就可以及时看到效果
初始状态


<包名.widget.AutoScaleTextViewandroid:id="@+id/tv_num"android:layout_width="44dp"android:layout_height="match_parent"android:gravity="center"android:maxLines="1"android:text="1"android:textColor="@color/main_color"android:textSize="20dp"android:textStyle="bold"/>

长文本状态:

<包名.widget.AutoScaleTextViewandroid:id="@+id/tv_num"android:layout_width="44dp"android:layout_height="match_parent"android:gravity="center"android:maxLines="1"android:text="123456789"android:textColor="@color/main_color"android:textSize="20dp"android:textStyle="bold"/>

自动缩放文字的TextView相关推荐

  1. Android TextView自动缩放字体

    Android TextView自动缩放字体 <TextViewandroid:layout_width="50dp"android:layout_height=" ...

  2. QT 布局,控件自适应大小 自动缩放 自动布局

    有时,我们需要我们的布局或控件,随窗口变化而变化:这时就要求我们注意一下: 1. 先来说简单的布局控件自适应 首先拖动两个 verticalLayout 放到窗口: 右击空白处:右键菜单 ->布 ...

  3. [转]图片自动缩放 js图片缩放

    转自:http://hi.baidu.com/crystalhx/blog/item/deba9b2320274340ac34de09.html 图片自动缩放 js图片缩放 2008-03-27 10 ...

  4. html字体颜色自动变化,js设置字体颜色_自动改变文字大小和颜色的js代码分享

    摘要 腾兴网为您分享:自动改变文字大小和颜色的js代码分享,追追漫画,易信,学宝,万达普惠等软件知识,以及59网批,tomatopie,物美多点,直播apk,三国全面战争,pc98,qq音乐插件,快捷 ...

  5. css背景图根据屏幕大小自动缩放

    css背景图根据屏幕大小自动缩放 代码: 1 2 3 4 5 6 7 8 9 10 <style> html,body{margin:0px;padding:0px;} #backgrou ...

  6. 通过自动缩放Kinesis流实时传输数据

    Kinesis是由AWS提供的一项流数据管理服务,可轻松收集.处理和分析实时流数据.本文详细介绍了迪士尼API服务团队如何实现Kinesis数据流的自动缩放功能,保证流量高峰时的数据传输效率,并有效降 ...

  7. aws terraform_在AWS第1部分中使用Terraform自动缩放组:基本步骤

    aws terraform 因此,您想使用Terraform在AWS上创建一个自动缩放组. 以下是达到此目的的最少步骤. 在编写实际代码之前,应指定aws terraform提供程序以及provide ...

  8. 在AWS第1部分中使用Terraform自动缩放组:基本步骤

    因此,您想使用Terraform在AWS上创建一个自动缩放组. 以下是达到此目的的最少步骤. 在编写实际代码之前,应指定aws terraform提供程序以及provider.tf文件上的区域. pr ...

  9. php背景图片随页面大小改变,css背景图根据屏幕大小自动缩放

    css背景图根据屏幕大小自动缩放 代码: html,body{margin:0px;padding:0px;} #background { position: fixed;top: 0;left: 0 ...

最新文章

  1. [LeetCode]Implement Trie (Prefix Tree)
  2. RxJava Rxandroid 结合 Retrofit 使用
  3. linux下查看tomcat的启动日志
  4. 天津php二次开发培训,天津PHP后台开发培训短期班
  5. xshell MySQL表备份_shell mysql数据迁移/备份
  6. AQS理解之四—看看我们写的和 ReentrantLock 的公平不公平锁的区别
  7. NOI[2001]食物链
  8. mikrotik dhcp server
  9. c++语言表白超炫图形_R语言统计与绘图:组合图形布局
  10. 促销海报创意|你想要的秋天(秋季),吸睛大促海报都在这里
  11. GridView实战一:自定义分页、排序、修改、插入、删除
  12. SpringBoot+Thyemleaf报错Template might not exist or might not be accessible
  13. 王者荣耀AI即将上线,队友再也不用担心你掉线了
  14. SharePoint 2010 添加“我的链接”菜单
  15. 【无标题】炒外汇是什么,为什么有人说炒外汇能发财
  16. FLASH三维照片墙组件(源文件)
  17. PDF文件title乱码
  18. Pygame实战之外星人入侵NO.7——大批外星人来袭
  19. 推荐 : 你想用深度学习谱写自己的音乐吗?这篇指南来帮助你!(附代码)...
  20. Windows下用命令行注销用户(包括注销其他用户)

热门文章

  1. 【设计模式】工厂设计模式
  2. 仿手机和微信通讯录A-Z姓名排序
  3. 软件需求管理用例方法 pdf_德国易用的需求管理方法-tenowork敏捷管理
  4. Scipy.integrate(scipy积分部分中文文档翻译,进度70%)
  5. 大数据、云计算、物联网、数据仓库、OLAP、OLTP、等大数据你必须知道并且了解的概念及相关关系,我的一些总结
  6. 大一机械类转计算机专业(软件工程)经历分享
  7. 批处理语言规则--编辑bat文件
  8. 鲁大师强势进军元宇宙
  9. 高精度脚印效果制作原理
  10. Mysql 使用企业级MEB进行数据库物理备份与恢复