Android——TextView的文字长度测量及各种padding解析

zz/2024/5/8 19:14:03

这篇博客会讲得比较杂:

TextView里各种padding的含义?
如何计算每行文字的长度?
设置android:maxLines="1"和android:singleLine="true"有什么区别?
为什么设置android:maxLines="1"时TextView的跑马灯效果就不能正常工作?

TextView里各种padding的含义?

虽然我们平时只用TextView显示纯文本数据,但其实TextView支持设置Background,四周的drawable小图标,以及Span数据比如文本或图片。在Android里不管是什么控件都是占据一个矩形的空间,各个矩形之间基本都可以设置padding属性,这样一来TextView就被分成多个矩形区域了,而TextView也提供了获取各种padding和长度的接口,如下:

getWidth(), getHeight()
getPaddingLeft/Right/Top/Bottom()
getCompoundPaddingLeft/Right/Top/Bottom()
getExtendedPaddingBottom/Top()
getTotalPaddingLeft/Right/Top/Bottom()

先看一下布局代码:

 <TextViewandroid:id="@+id/tv_bound"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#dcdcdc"android:drawableLeft="@drawable/cattle"android:drawablePadding="10dp"android:gravity="left|center"android:includeFontPadding="false"android:padding="20dp"android:singleLine="true"android:text="噼里啪啦地落"android:textColor="@color/black"android:textSize="24sp" />

下面是效果图,做了一些标注:
在这里插入图片描述
下面来看一下上述获取长度的接口的数据,你可以使用打日志方式,我是比较习惯用调试方式:
在这里插入图片描述所以,总结一下:
getWidth(), getHeight():对应你代码里的layout_widthlayout_height

getPaddiingLeft/Right/Top/Bottom():对应代码里的Padding。
以上两个比较容易理解,毕竟经常打交道。

getCompoundPaddingLeft/Top/Right/Bottom(): 翻译成中文就是获取混合的Padding, 既然是混合的,那么它的值也就是padding + 图片的大小 + drawablePadding的值。说得通俗点就是,它是获取文字区域到TextView边界之间的间隔。附上源码:

 /*** Returns the left padding of the view, plus space for the left* Drawable if any.* 返回left padding,如果有left drawable,那就加上他的空间*/public int getCompoundPaddingLeft() {final Drawables dr = mDrawables;if (dr == null || dr.mShowing[Drawables.LEFT] == null) {return mPaddingLeft;} else {return mPaddingLeft + dr.mDrawablePadding + dr.mDrawableSizeLeft;}}

getExtendedPaddingTop():这个是当有部分文字没有显示出来时,也就是设置了maxLine时,它的值就等于首行文字到TextView顶端的距离。同理,getExtendedPaddingBottom(): 就是最后一行文字到TextVeiw底部距离。其他情况下,他的值等于getCompoundPaddingTop/Bottom()的值。这个源码不多,但也不怎么好讲解,就贴两张图对比下,就明白了。
11.png
在这里插入图片描述getTotalPaddingLeft/Right/Top/Bottom():翻译下就是获取总的Padding值,看了下源码,左右的值直接就是等于compoundPadding的值,上下的值等于ExtendedPadding的值再加上offset的值(跟Gravity的垂直方向的布局有关。说得通俗点就是,不管有没有maxLines,上下的值都分别等于首行到TextView顶端和末行到TextView底部的值。

这些接口除了前面两个比较常用外,其他基本很少用吧,我也是因为在看TextView的跑马灯部分的源码才接触到,然后为了弄明白才记录下来的。至于后面那些接口的应用场景,getCompoundPadding()这个的应用场景倒是很明确,可以用来判断相应的drawable是否发生点击事件之类的需求。至于extendedPadding和totalPadding这两个的应用场景,我想了想,觉得应该是涉及需要计算显示出来后的文字高度的相关需求时会用到吧。有对这些接口很熟悉的童鞋可以分享出来哈,一起学习学习。

最后用一张图总结一下,我把TextView分成内容区域,内容区域和TextView边界之间的间隔就是padding的值,内容区域包括drawable区域文字区域,drawable区域和文字区域之间的间隔就是drawablePadding的值,文字区域和TextView之间的间隔就是CompoundPadding的值。
在这里插入图片描述

如何计算每行文字的长度?

Q:每行文字的长度不就等于TextView的宽度吗?直接getWidth()不就好了?
A:再看一下上面那部分内容你就清楚了,只有当TextView宽度设置为wrap_content,且没有背景图或drawable时,文字的长度才等于getWidth();当文字很少,没有填充满时,或是溢出时,文字的长度都得另外计算。

Q:每行文字的长度不一样长吗?
A:因为TextView有自己的换行策略,如下图所示,显然每行的文字长度不一样长。
在这里插入图片描述
Q:文字的长度是指哪段长度?
A:看需求吧,我觉得通常情况下都是只需要计算显示在屏幕上的可见区域的每行文字的长度即可。还有那么一种需求,当设置了溢出内容用…表示时,那么其实每行文字的实际长度就不止可见区域那么长了。

那么该如何计算文字的长度呢?单单根据上一部分里的各种Padding值肯定不够,根据各种Padding顶多计算出文字区域的宽度,但实际上每一行文字并不会那么刚刚好占满文字区域的宽度,那么就还得借助其他来进行计算。

方法1:TextView.getPaint().measureText(String text)

 mTextView.getPaint().measureText(mTextView.getText().toString());

但这种方法只是测试传入的text在该TextView的配置下的总长度,并不是计算每一行的长度。

方法2:TextView.getLayout().getLineWidth(int line)
在这里插入图片描述
TextView对应的是上图,正好,利用方法1验证一下,这个方法计算得到的是不是每行文字的长度。
在这里插入图片描述
完全正确,所以说这个方法确实计算得到的是每一行文字的实际长度,注意这里是实际长度,也就是说当设置singleLine属性时,用这个方法测量得到的是一整行文字的长度,包括溢出部分。

设置android:maxLines="1"和android:singleLine="true"有什么区别?

官方是推荐说不要再使用singleLine,用maxLines="1"代替。但其实这两个的效果是不一样的,官方api接口里有说明,都是英文我就不贴图了,大概翻译下:
maxLines:限制TextView的最高高度,大概就是指通过限制行数来限制最高高度。
singleLine: 强制设置TextView的文字不换行。

区别就是:maxLines还是会默认自动进行换行策略,假如一段文字自动换行后有5行,maxLines设置为1,那么就只显示第一行的内容,其他行不显示。
但是,如果是设置了singleLine, 那么这段可以有5行的文字将会被强制放在1行里,然后看最多能显示多少字符,剩下的不显示。

这样的区别就是导致了很多人在使用TextVeiw的跑马灯效果时不能正常工作的状态,所以下面单独列出个问题来讲。

为什么设置android:maxLines="1"时TextView的跑马灯效果就不能正常工作?

明白了maxLines="1"和singleLine的区别后,只要再明白跑马灯的原理,就很容易理解为什么设置成maxLines="1"时跑马灯不工作了。我在上一篇博客里写过跑马灯启动的条件,具体的分析可以去上一篇看,这里大概说下。

跑马灯要启动要同时满足四个条件,其中有一个条件就是这一行的文字长度要大于文字区域的宽度,文字区域的宽度就是TextView的getWidth()扣去ComPoundpaddingLeft再扣去CompoundPaddingRight剩下的长度。

如果是maxLines="1"的话,那么就像上一问中分析的那样,所有的文字其实已经被自动换行了,只显示第一行,而换行是什么,就是为了让每行文字的长度超过文字区域的宽度才进行的换行,也就是说,如果一段文字经过TextView的换行后,那么每行的文字长度都不会超过文字区域的长度。这样一来,自然就不满足跑马灯的启动条件之一了,跑马灯也就不能正常工作了。

singleLine的话,则是不会对一段文字进行换行处理,这样一来,自然就超过了文字区域的长度,所以如果要设置跑马灯效果的话,只能用singleLine不能用maxLines=“1”。

原文链接:https://www.jianshu.com/p/fd9cce7a333f


http://www.ngui.cc/zz/2147089.html

相关文章

文本搜索(C实现)

#include <stdio.h> #include <string.h> using namespace std;struct cha {char aa[50];//存储单词&#xff08;不重复&#xff09;int num;//该单词出现的次数int Mark[100];//标记该单词出现过的行 };cha CHA[1000]; struct Mystr {char bb[50];//存储 &#…
阅读更多...

一遍就能学会,超详细的AI配音教学,文本转语音

想做自媒体影视解说、视频剪辑等各类解说类的视频作品&#xff0c;但是不想自己配音&#xff1f; 你还在花钱买别人的课程教你如何制作&#xff1f;还在使用别人的付费软件&#xff1f; 别再花冤枉钱了&#xff0c;今天这期内容就来教你如何配音&#xff08;文案转语音&#…
阅读更多...

中文文本纠错之入门篇

每天给你送来NLP技术干货&#xff01;来自&#xff1a;NLP日志提纲1 简介2 检测任务3 纠正任务4 总结参考文献1 简介在很多中文NLP相关的落地场景都会涉及到文本纠错的相关技术&#xff0c;例如跟各种形式机器人的语音或者文字对话&#xff0c;或者用手机扫描相关的PDF或者图片…
阅读更多...

web 文本溢出处理显示省略号

1、单行文本溢出显示省略号 方法1&#xff1a;省略号 单行文本&#xff1a; width&#xff1a;200px&#xff1b;设置盒子的宽度(限制宽度) white-space&#xff1a;nowrap&#xff1b;设置文本不换行 overflow&#xff1a;hidden&#xff1b;溢出隐藏 text-overflow&#xf…
阅读更多...

python从图片中提取文字_IT业界:3行代码,即可用Python从图片中提取文本!

在您开始之前&#xff0c;在你的计算机将需要Python&#xff0c;但您可能不需要下载它。首先检查(在命令行窗口输入python)有没有安装Python!如果你看到了一个Python解释器的响应&#xff0c;那么就能在它的显示窗口中得到一个版本号。通常较新的版本都可以做到Python的向前兼容…
阅读更多...

【精】领扣LintCode算法问题答案:336. 文本压缩

336. 文本压缩 描述 给你一个只含有可见字符&#xff08;ASCII 码范围 32 至 126&#xff09;文本文件&#xff0c;文件中可能出现一些重复的单词&#xff0c;你需要对它们进行压缩。 压缩规则如下&#xff1a; 如果原文件中的字符不是英文字符&#xff0c;那么保留这些字符…
阅读更多...

lstm 文本纠错_中文文本纠错算法--错别字纠正的二三事

本文首先介绍一下&#xff1a;1)错别字的类型有哪些2)错别字纠正的关键技术和关键点3)简要介绍我们项目中采用的文本纠错框架4)介绍错别字项目的个人体会5)几个现成的工具包 &#xff0c;百度nlp平台最近也推出了文本纠错模块&#xff0c;处于内测中&#xff0c;所以没有进行比…
阅读更多...

python判断文本内容_文本检测、文本识别(cnn+ctc、crnn+ctc)

代码目录 |---- config.py # 工程参数配置 |---- ocr_lib # 模型、数据生成 | |---- crnn.py # 选用不同模型 | |---- vgg16.py | |---- vgg19.py | |---- Xception.py | |---- densenet.py | |---- data_generator.py | |---- data_load.py | |---- gen_train_val_data.py | |…
阅读更多...

html数字显示百分比,扣丁学堂html5 教程之Canvas实现圆形进度条并显示数字百分比效果...

今天扣丁学堂html5培训小编和大家分享一下Canvas实现圆形进度条并显示数字百分比效果示例&#xff0c;对html5感兴趣的小伙伴或者是参加学习的小伙伴可以了解一下。Canvas实现圆形进度条并显示数字百分比效果本文介绍了HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例&am…
阅读更多...

pgsql 比较数字字符串_pgsql与mysql 下 varchar类型的数字文本的排序 区别

浅谈WEB跨域的实现(前端向)同源策略/SOP(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS.CSFR等攻击(可以参考我的这篇文章). SOP要求 ...Log4j简单学习笔记log4j结构图: 结构图展现出了log4j的主结构.logger:表示…
阅读更多...
最新文章

代做工资流水公司宿迁查购房银行流水海口转账流水样本南阳薪资流水样本淮安办理签证银行流水宁波工作收入证明开具九江背调流水多少钱无锡代办工资流水蚌埠银行流水电子版开具西宁薪资流水单成都背调工资流水样本中山薪资银行流水查询杭州工资代付流水模板沧州代做日常消费流水重庆房贷流水打印保定代做流水账单广州背调银行流水打印芜湖日常消费流水查询太原对公账户流水样本鞍山打印个人银行流水开封房贷流水图片许昌办车贷银行流水黄冈企业对公流水查询莆田银行流水账单图片遵义代办企业银行流水湘潭对公账户流水公司青岛开工资流水账单商丘工资流水费用衡阳工资代付流水代做宁波工资银行流水九江代做贷款工资流水香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化