需求
使-
不能成为换行的依据,除非该单词超长到一行装不下才可以让-
出现在一行的开头或结尾。
实现效果
实现过程
Word 类
用于保存单词内容、宽度、高度
|
|
Line 类
用于保存一行中的 Word
|
|
将字符串按自定义规则分成单词
遍历字符串中的每一个字符,如果该字符不是-
,且不是在A~Z
或a~z
之间,则认为已识别到单词的结尾
|
|
重写 onMeasure 方法
1、获取实际可用的宽高
|
|
2、清除缓存
|
|
3、遍历已分成的单词列表,测量每个单词在指定的 paint 下所占用的宽度
|
|
(1)如果已占用宽度加上该单词的宽度比实际可用的宽度小或相等,则将该单词添加到行中,并添加一个单词间距的宽度到已占用宽度上
|
|
(2)如果已占用宽度加上该单词的宽度比实际可用的宽度大,则封闭前一行,创建新行
|
|
同时判断当前这一个单词的宽度是否已经超过实际可用的宽度了,如果超过了,则按照实际可用宽度截取字符串到一行,最后剩余部分单独添加到新的一行,作为该行的第一个单词,并添加一个单词间距的宽度到已占用宽度上
|
|
否则,将该单词作为新行的第一个单词,并添加一个单词间距的宽度到已占用宽度上
|
|
4、最后,可能剩余宽度不足一行的情况,将其封闭为一行
|
|
5、计算实际占用的宽度和高度并使用
|
|
一种提高获取被截取字符串索引的速度的方法
定义一个递归方法,传入的参数是单词和一行的最大宽度。当传入的单词经过测量后的宽度小于或等于一行的最大宽度时,即认为已完成所有单词的截取,结束递归,或者当传入的字符串为空串时,也会结束递归
|
|
当传入的单词经过测量后的宽度大于一行的最大宽度时,计算单词中一个字符大概占的宽度,使用一行的最大宽度除以该宽度可得大概能满足字符串截取后的长度刚好等于一行的宽度
|
|
为了精确,继续对截取字符串所需的索引的值做逼近处理,当获取到宽度不大于一行的宽度的最大值后,截取字符串,将剩余子串继续进行递归。
|
|
大概计算出位置后,再遍历查找
|
|
重写 onDraw 方法
canvas 在绘制文本时,需要知道的是绘制结束的位置,也就是图中大概红点所表示的位置,其余从哪画、怎么画均交给 paint 处理
1、计算第一个 Y,后面的 Y 均在此基础上叠加
|
|
2、遍历行,当行内文本需要居中时,计算一行中所有单词及单词间的间隔使用的宽度,将剩余宽度作为左端偏移量
|
|
3、在行中遍历单词,绘制完一个单词后,X 位置需要加上单词宽度和单词间的间距
|
|
4、当一行绘制完后,Y 位置需要加上行高和行间距
|
|