博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
label里面的文字换行_Android 模仿微信读书左右对齐的文字效果
阅读量:4964 次
发布时间:2019-06-12

本文共 1426 字,大约阅读时间需要 4 分钟。

ab7fc91143124e330346058d6ee95625.png

秦子帅 明确目标,每天进步一点点.....
7ffac25f92bad32ad1ef30bc3cc8cd84.png
作者 |  Amter
地址 |  juejin.im/post/5e3a3f73518825490f7218db
详解
左右对齐的文字效果,很常见,在大多数文章上都可以看到,这种效果能给人带来一种界面整洁的效果,但是如果只是左对齐的话,页面显示就会参差不齐; 而app的页面大多数都是图形+文字的显示效果,左右对齐的文字效果需求还是非常大的; 而反观Android的官方控件TextView并没有提供这种左右对齐的显示效果,那么就只能自己来造轮子了;
这里会涉及到实现原理的解析,如果只是需要使用轮子,请拉到最底下;

1. TextView 效果

首先,让我们先来看一下TextView的显示效果:
5d777f3ebe25f8e2206da74e450ac794.png 中文情况下还好,但是英文情况下的显示效果就不是很好看了,右边会留了很长的空白,对于追求用户体验的,这样的显示效果肯定是不能满足的;但是TextView内部也没有提供API给我们,那么就只能自己来实现了;

2. 对齐原理

原理: 将一行剩余的宽度平分给当前单词的间距,这样来达到左右对齐的效果; 那么我们就有两种实现方案: (1)TextView绘制一行的计算原理简单粗暴,就是计算这一行显示不下一个单词的时候,就进行回车换行; TextView已经手动给我们计算出了一行能显示多少的字符,那么我们只需要通过计算剩余的宽度再进行绘制即可; 会存在问题: 如果一行存在单词较少的情况,就会出现间隔过大的问题; 比如:
8b05c986280f2894924d87f66901ba16.png (2)通过手动计算一行能显示多少个字符,然后再计算剩余的宽度进行绘制;这样只是比第一步多了个自己计算一行能显示多少个字符的操作; 但是这样也会存在问题:如果单词存在中英文混合,或者非中文的情况,会很大概率出现换行时单词被截断的问题;比如:
cb820efdbc58b20dbd1904963bbfa004.png
3. 最终方案 以上两种方案都会存在缺陷,那这样的话我们就得对出现的问题提出解决方案; 当前市场上有成熟的阅读软件,最常用的就是左右对齐的排版效果,来看看当前的阅读软件是怎么解决这些问题的; 先看一下微信读书app的显示效果:
fcd935ad9d548873b6fecb4e6138040d.png 再看一下掌阅app的显示效果:
0e5c68c46256f07f0acda2b00409015e.png 微信读书和掌阅都是对这个过长的单词进行截断处理,然后使用“-”符号将这两个截断的单词连接起来,再进行绘制时就不会出现上述两种方案的问题; 那么最终方案就是: 通过手动计算一行能显示多少个单词,如果一行最后一个单词显示不下,则进行截断处理,中文则不不存在该问题,这里针对非中文的处理; 然后再根据剩余空间进行绘制; 那么有了方案之后,接下来看看具体要怎么实现;

4. 最终实现

(1)先遍历当前页面的字符,将中英文截取为一个个单词,具体实现在getWordList(String text)方法里面; 通过遍历当前的字符,判断如果为中文时,则为一个单词,非中文时则通过遍历该英文单词进行拼接,最后拼成一个非中文单词; (2)通过遍历当前的单词,计算每一行要显示的单词集合,具体实现在getLineList(List frontList)这个方法里面; 遍历单词时,当添加最后一个单词时,宽度已经超过一行显示的距离,那么就判断最后一个单词是否为中文,是的话则添加到下一行,否则的话则进行截断处理; (3)通过第二步计算出来的每一行的单词,计算剩余的距离进行绘制;
406a616151435e141c5f0556cefead63.png 源码: https://github.com/Panxuqin/AlginProject

---END---

 

76d57ab932a3f4960e3adf49de1be78b.png

 创作不易,点个“
在看
09a39284edbc96577873a272f1b7ccad.gif

转载地址:http://pmqhp.baihongyu.com/

你可能感兴趣的文章
目录导航「深入浅出ASP.NET Core系列」
查看>>
简易爬虫(爬取本地数据)
查看>>
python 进程间通信
查看>>
深拷贝 vs 浅拷贝 释放多次
查看>>
Javascript 有用参考函数
查看>>
点群的判别(三)
查看>>
GNSS 使用DFT算法 能量损耗仿真
查看>>
【转】Simulink模型架构指导
查看>>
MYSQL数据库的导出的几种方法
查看>>
SQL Server-5种常见的约束
查看>>
硬件之美
查看>>
[转载]java开发中的23种设计模式
查看>>
表格的拖拽功能
查看>>
函数的形参和实参
查看>>
文字过长 用 ... 表示 CSS实现单行、多行文本溢出显示省略号
查看>>
1Caesar加密
查看>>
【TP SRM 703 div2 500】 GCDGraph
查看>>
MapReduce 重要组件——Recordreader组件 [转]
查看>>
webdriver api
查看>>
apache 实现图标缓存客户端
查看>>