仿instagram文字自动排版功能实现
概述
玩过ins的朋友应该知道ins里面有一个编辑文字自动排版的功能,应用会根据用户输入的每行文字自动进行排版,以达到一个紧凑美观的效果。
效果图如下:

因为最近刚好在做这样的需求,于是对其实现原理做了研究,现在写下这篇博客希望能帮到有需要的人。
下面是我实现的效果图:

思路探究
因为网上找不到什么相关的资料,所以就直接通过玩ins猜测大概的实现思路,我整理下自己一开始的一些疑问。
-
当输入的文字越来越多,字体越来越小时怎么保证每行最多能够显示的文本不变?
正常情况下,当你字体越来越小而输入框宽度不变时,那么你每行可输入的文字就会变多,但是你发现ins无论字体多大,每行最多能容纳的文本是不变。我猜测可能是输入框会随着字体的变化而改变。
通过打开开发者选项的应用布局边界,可以看到确实ins的输入框的宽度是动态变化的。下面是打开应用布局边界后的效果图:

当然,这里可能会引入一个新的问题,那就是输入框的宽度是怎么动态改变的?好让它刚好能够在字体大小变化的过程中最多可容纳的文本数不变。这个问题会在下面说,这里先不展开。
- 每行字体大小是怎么确定的,又是怎样联动变化的?
这个问题一开始想了很久,我觉得如果把这个问题搞明白基本就已经成功一半了。大部分人一开始可能都会很容易陷入局部思维,包括我也一样,一直在纠结每行字体是怎么变化的,但其实应该要从整体考虑,从整体考虑一切都会变得很简单,代码实现上也会变得更加容易,不需要处理各种特殊情况。
具体思路:遍历每行文本,以适应最大文本宽度算出每行的字体大小,然后以每行的字体大小算出每行行高度,把每行行高度累加得到文本总高度,然后判断文本总高度是否大于最大文本高度,如果大于则按比例缩小每行的字体大小,以缩小每行的行高度,得到新的文本总高度,直到文本总高度小于最大文本高度。
上面的这么大段文字总结起来其实就4个步骤:
- 拆行
- 按匹配最大宽度计算每行字体大小
- 按匹配最大高度计算每行字体大小
- 重新调整EditText宽度
知识储备
在动手之前我们需要知道几个相关知识点:
- span
span可以使TextView分段显示不同样式的文字。在自动排版中因为每行文字字体大小不一样,所以我们需要为每行文字设置不同的span。 - Layout
Layout是一个用于各种文本计算的辅助类,TextView的文字排版布局都是依赖于Layout实现的。因为Layout是完全跟TextView解耦的,所以我们可以构建合适的Layout来帮助我们计算字体大小。
下面是Layout的官方定义:
A base class that manages text layout in visual elements on the screen.
For text that will be edited, use a DynamicLayout, which will be updated as the text changes. For text that will not change, use a StaticLayout.
Layout有几个子类,其中较常用的是DynamicLayout和StaticLayout,按照官方的说法,当你的文本是可编辑的则使用的是DynamicLa

本文详细介绍了仿Instagram文字自动排版功能的实现过程,包括拆行、按最大宽度和高度计算字体大小、调整EditText宽度等步骤。通过监听文本变化,动态计算每行字体大小以保持紧凑美观的效果。文章还探讨了EditText的Layout动态变化和解决文本换行问题的策略。
最低0.47元/天 解锁文章
364

被折叠的 条评论
为什么被折叠?



