因为最近刚好在做这样的需求,于是对其实现原理做了研究,现在写下这篇博客希望能帮到有需要的人。
下面是我实现的效果图:
思路探究
因为网上找不到什么相关的资料,所以就直接通过玩ins猜测大概的实现思路,我整理下自己一开始的一些疑问。
当输入的文字越来越多,字体越来越小时怎么保证每行最多能够显示的文本不变?
正常情况下,当你字体越来越小而输入框宽度不变时,那么你每行可输入的文字就会变多,但是你发现ins无论字体多大,每行最多能容纳的文本是不变。我猜测可能是输入框会随着字体的变化而改变。
通过打开开发者选项的应用布局边界,可以看到确实ins的输入框的宽度是动态变化的。
下面是打开应用布局边界后的效果图:
当然,这里可能会引入一个新的问题,那就是输入框的宽度是怎么动态改变的?
好让它刚好能够在字体大小变化的过程中最多可容纳的文本数不变。
这个问题会在下面说,这里先不展开。
每行字体大小是怎么确定的,又是怎样联动变化的?
这个问题一开始想了很久,我觉得如果把这个问题搞明白基本就已经成功一半了。大部分人一开始可能都会很容易陷入局部思维,包括我也一样,一直在纠结每行字体是怎么变化的,但其实应该要从整体考虑,从整体考虑一切都会变得很简单,代码实现上也会变得更加容易,不需要处理各种特殊情况。
具体思路:
遍历每行文本,以适应最大文本宽度算出每行的字体大小,然后以每行的字体大小算出每行行高度,把每行行高度累加得到文本总高度,然后判断文本总高度是否大于最大文本高度,如果大于则按比例缩小每行的字体大小,以缩小每行的行高度,得到新的文本总高度,直到文本总高度小于最大文本高度。
上面的这么大段文字总结起来其实就4个步骤:
- 拆行
- 按匹配最大宽度计算每行字体大小
- 按匹配最大高度计算每行字体大小
- 重新调整EditText宽度
知识储备
在动手之前我们需