原标题:Android 模仿微信读书文字左右对齐效果

本文作者

作者:Amter

https://www.jianshu.com/p/020786e22a6f

左右对齐的文字效果,很常见,在大多数文章上都可以看到,这种效果能给人带来一种界面整洁的效果,但是如果只是左对齐的话,页面显示就会参差不齐;而app的页面大多数都是图形+文字的显示效果,左右对齐的文字效果需求还是非常大的;而反观Android的官方控件TextView并没有提供这种左右对齐的显示效果,那么就只能自己来造轮子了;

这里会涉及到实现原理的解析,如果只是需要使用轮子,请拉到最底下。

1

TextView 效果

首先,让我们先来看一下TextView的显示效果:

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

2

对齐原理

原理:将一行剩余的宽度平分给当前单词的间距,这样来达到左右对齐的效果;

那么我们就有两种实现方案:

(1)TextView绘制一行的计算原理简单粗暴,就是计算这一行显示不下一个单词的时候,就进行回车换行;TextView已经手动给我们计算出了一行能显示多少的字符,那么我们只需要通过计算剩余的宽度再进行绘制即可;

会存在问题:如果一行存在单词较少的情况,就会出现间隔过大的问题;

比如:

(2)通过手动计算一行能显示多少个字符,然后再计算剩余的宽度进行绘制;

这样只是比第一步多了个自己计算一行能显示多少个字符的操作;

但是这样也会存在问题:如果单词存在中英文混合,或者非中文的情况,会很大概率出现换行时单词被截断的问题;

比如:

3

最终方案

以上两种方案都会存在缺陷,那这样的话我们就得对出现的问题提出解决方案;

当前市场上有成熟的阅读软件,最常用的就是左右对齐的排版效果,来看看当前的阅读软件是怎么解决这些问题的;

先看一下微信读书app的显示效果:

再看一下掌阅app的显示效果:

微信读书和掌阅都是对这个过长的单词进行截断处理,然后使用“-”符号将这两个截断的单词连接起来,再进行绘制时就不会出现上述两种方案的问题;

那么最终方案就是:

通过手动计算一行能显示多少个单词,如果一行最后一个单词显示不下,则进行截断处理,中文则不不存在该问题,这里针对非中文的处理;然后再根据剩余空间进行绘制;

那么有了方案之后,接下来看看具体要怎么实现;

4

最终实现

(1)先遍历当前页面的字符,将中英文截取为一个个单词,具体实现在getWordList(String text)方法里面;通过遍历当前的字符,判断如果为中文时,则为一个单词,非中文时则通过遍历该英文单词进行拼接,最后拼成一个非中文单词;

(2)通过遍历当前的单词,计算每一行要显示的单词集合,具体实现在getLineList(List frontList)这个方法里面;遍历单词时,当添加最后一个单词时,宽度已经超过一行显示的距离,那么就判断最后一个单词是否为中文,是的话则添加到下一行,否则的话则进行截断处理;

(3)通过第二步计算出来的每一行的单词,计算剩余的距离进行绘制;

5

优化点

(1)代码里修改了绘制的逻辑后,那么关于TextView的一些基础属性也要进行适配;

比如布局的方向,可以使用TextView自带的属性来进行设置;通过android:gravity=""和android:textAlignment=""属性来定义布局的文字方向,是居左还是居右边,这两个属性都可以进行设置,textAlignment属性的优先级比较高,如果同时设置的话,那么则以textAlignment属性为准;

< com.example.testdemo1.XQJustifyTextView

android:layout_width= "match_parent"

android:layout_height= "wrap_content"

android:layout_margin= "10dp"

android:textSize= "16sp"

android:gravity= "start"

android:textAlignment= "textStart"/>

(2)对于实现的英文单词截断的效果,还有优化的地方,经过一些小伙伴的提醒,发现还可以通过音节的进行拆分,再去研究了一波微信读书和掌阅的截断效果,发现确实是使用了音节来进行截断,这样展示效果就更加完美了;

后面研究了一波资料后,发现可以通过元音来进行截断,英语单词的元音有5个,分别是a,e,i,o,u; 那么就可以通过元音加一个辅音的规则来进行截断;比如an,en之类的;这里只实现了一种规则来进行截断,其他的规则过于复杂,暂时没有引入;

看一下优化后的效果:

源码实现请移步GitHub查看:

https://github.com/Amterson/AlginProject

喜欢的可以点个star,谢谢!返回搜狐,查看更多

责任编辑:

android让字体左右对齐,Android 模仿微信读书文字左右对齐效果相关推荐

  1. android 模仿微信读书,Flutter 模仿微信读书实现案例

    前言: 各位同学大家好,有一段时间没有给大家更新博客了,最近使用flutter跨平台写了一个模仿微信读书app demo版本(模仿其中部分经典页面不是全部)觉得有几个点值得分享一下,趁着今天放假,就发 ...

  2. flutter 微信语言选择_Flutter 模仿微信读书效果!

    原标题:Flutter 模仿微信读书效果! 作者:xq9527链接:https://www.jianshu.com/p/ee9d30ba2c42 前言 各位同学大家好,有一段时间没有给大家更新博客了, ...

  3. Android 模仿微信读书左右对齐的文字效果

    左右对齐的文字效果,很常见,在大多数文章上都可以看到,这种效果能给人带来一种界面整洁的效果,但是如果只是左对齐的话,页面显示就会参差不齐:而app的页面大多数都是图形+文字的显示效果,左右对齐的文字效 ...

  4. android按住录音按钮_Android模仿微信录音、发送语音效果实现

    在项目开发中,有个需求:实现模仿微信录音,发送语音的功能.长按按钮录音,弹框显示语音时间,以及上滑取消发送.我重写了一个发送语音的控件,以实现该功能. 首先添加权限: AudioRecorderBut ...

  5. 李长军android语音开发_Android模仿微信录音、发送语音效果实现

    在项目开发中,有个需求:实现模仿微信录音,发送语音的功能.长按按钮录音,弹框显示语音时间,以及上滑取消发送.我重写了一个发送语音的控件,以实现该功能. 首先添加权限: AudioRecorderBut ...

  6. android 中使用TabHost控件实现微信界面的底部菜单效果

    首先,在布局文件中的代码如下:(菜单位于底部,需要在代码中设置) <TabHostandroid:id="@android:id/tabhost"android:layout ...

  7. android+设置字体行高,android textview设置字体的行距和字间距

    android textview设置字体的行距和字间距 字间距 textView有一个属性android:textScaleX是调节字间距的,它的值是一个float型.查看源代码,默认textView ...

  8. android textview 字体颜色设置,Android textview 设置不同的字体大小和颜色

    在实际应用中,需要将一个字符串已不同的颜色,字体显示出来.当然完全可以通过不同textview拼接出来.也可以通过一个textview来展示. 步骤如下: 1.定义不同style . 不妨如下定义2个 ...

  9. android灰字体什么意思,Android 6.0状态栏使用灰色文字和图标

    Android StatusBar中的字体和图标默认都是白色的,但是Android在6.0之前是没有办法更改这个颜色, 在Android 6.0中提供了一个SYSTEM_UI_FLAG_LIGHT_S ...

最新文章

  1. 【Qt】AVFrame转QImage
  2. Android之自定义AlertDialog无法监听控件
  3. Linux嵌入式 -- Bootloader , Uboot
  4. UVa810 A Dicey Problem 筛子难题
  5. 洛谷 P1706 P1036 -小试牛刀
  6. 开发者说:如何使用插件降低上传文件部署服务的复杂度
  7. codeforces B. Friends and Presents(二分+容斥)
  8. python画图入门
  9. 3-Scala控制结构
  10. 【Spring 工厂】注入详解 — Set注入(JDK内置类型,用户自定义类型)、构造注入(重载)
  11. kali升级软件_KALI更新软件源地址
  12. [篇五章二]_使用 USB 系统安装盘在真机上安装激活 Windows 10 LTSC 2021 中文企业版系统
  13. 计算机等级考试报名被锁死,注册表被锁?教你解开的三种方法!
  14. 'dict' object has no attribute '_txn_read_preference' Sort exceeded memory limit of 10485760
  15. 趁着双11,写个京东商品自动下单
  16. 每月改掉一个坏习惯,遇见更好的自己
  17. java word导出表格_Java Word模板导出包含表格单元格合并
  18. SQLTRACE的几个用法
  19. 亚太元宇宙新纪元峰会于1月12日在上海淳大万丽酒店盛大召开
  20. nargin 和 nargout

热门文章

  1. js中的json和ascii转换
  2. Windows10关于拨号上网热点分享的操作
  3. TensorFlow RunTime(TFRT) 小试
  4. 201871010134-周英杰《面向对象程序设计(Java)》第四周学习总结
  5. Mozilla 宣布 Firefox OS 应用原生支持 Android
  6. Android:插值器(Interpolator)和估值器(TypeEvaluator)的理解和使用
  7. 应用安全系列之二十九:密码管理
  8. Java游戏服务器系列:传统的BIO(OIO)、NIO与Netty中的BIO(OIO)、NIO
  9. A - DZY Loves Sequences
  10. UBUNTU16.04使用CornerNet_Lite进行目标识别并嵌入到ROS中