Android 实现文字左右对齐

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

1. TextView 效果

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

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

2. 对齐原理

原理:将一行剩余的宽度平分给当前单词的间距,这样来达到左右对齐的效果;
那么我们就有两种实现方案:

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

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

比如

(2)通过手动计算一行能显示多少个字符,然后再计算剩余的宽度进行绘制;
这样只是比第一步多了个自己计算一行能显示多少个字符的操作;

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

比如

3. 最终方案

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

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

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

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

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

那么最终方案就是:

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

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

4. 最终实现

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

(2)通过遍历当前的单词,计算每一行要显示的单词集合,具体实现在getLineList(List<String> 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

到这里就结束啦。

以上就是Android 实现文字左右对齐的详细内容,更多关于Android 文字左右对齐的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android8.1原生系统网络感叹号消除的方法

    原生系统Android8.1上,WiFi上出现感叹号,此时WiFi可正常访问. 原因 这是Android 5.0引入的网络评估机制:就是当你连上网络后,会给目标产生204响应的服务器发送给一个请求,如果服务器返回的是状态码为204的响应,那么就被认为网络可以访问:否则,如返回的是其他状态码,那么将被视为网络访问需要登录操作等:没有响应的话,就被认为是网络不可访问.这里的情况就是,目标服务器不能正常访问 产生204响应的服务器 加粗网址亲测可行,其余未测试,但可作为一个参考 http://conn

  • android命令行模拟输入事件(文字、按键、触摸等)

    前言 通过adb shell input可以模拟android各种输入事件,比如文字.按键.触摸等等. adb shell input Usage: input [<source>] <command> [<arg>...] The sources are: keyboard mouse joystick touchnavigation touchpad trackball dpad stylus gamepad touchscreen The commands and

  • Android实现文字动态高亮读取进度效果

    本文实例为大家分享了Android实现文字动态高亮读取进度的具体代码,供大家参考,具体内容如下 1.效果图 类似歌词的效果.播放下面文字的音频,同时音频播放的进度和文字高亮进度保持一致. 2.代码结构和实现 简单的类图: ISubtitleView接口代码如下: /** * 简要功能描述 * <p> * <详细功能描述> * * @author : liuxs * @date : 2021/3/18 */ public interface ISubtitleView { /** *

  • Android基于AdapterViewFlipper实现的图片/文字轮播动画控件

    1. 问题/坑点 1.1 item宽高不生效问题 需要注意的是,AdapterViewFlipper 在布局时,宽高一定要用 match_parent 或者 具体dp值. 如果宽.高中使用了 wrap_content 时,会导致 AdapterViewFlipper 容器的宽高,最终变成第一个item的宽高.即使后续item的宽高超过第一个item,也不会生效,内容显示只会被限定在第一个的宽高范围内. 原理也很好理解,后续item没有绘制出来时, wrap_content 计算出来的结果,就是第

  • Android实现文字消除效果

    今天和大家分享一个如何从右到左消除文本的动画. 先看效果图: 由于项目和语音识别相关,有时候人在不经意间交流的无效音频会被识别出来,并展示于界面,为了美观,客户要求我们将这些无效的识别文本用一个从右到左的动画给清除,于是便有了下述的技术实现. 嗯,效果做完后发现原理及其简单,仅此记录一下. 1.layout文件先在这儿贴一下 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and

  • Android实现文字下方加横线

    本文实例为大家分享了Android实现文字下方加横线的具体代码,供大家参考,具体内容如下 public class WhiteTextviewWithWhiteBottomLine extends LinearLayout { private Context mContext; public WhiteTextviewWithWhiteBottomLine(Context context) { this(context, null); } public WhiteTextviewWithWhit

  • Android实现文字滚动播放效果的代码

    在开发时,我们会遇到文字过长,TextView不能完全展示,但又不想文字换行展示,这样有时会影响美观.这时我们就需要文字滚动播放,让用户可以看到所有的文字. 话不多说,直接上代码: import android.content.Context; import android.util.AttributeSet; import android.widget.TextView; public class MarqueTextView extends TextView { public MarqueT

  • Android获取文字高度的三种方法

    前言 本文是对获取文字高度整理和总结,参考资料源自 statcoverflow的一个回答.具体参看下面的参考链接 获取文字高度的三个方法 paint.getTextBounds(String text, int start, int end, Rect bounds) paint.getFontMetrics() StaticLayout 1 paint.getTextBounds(String text, int start, int end, Rect bounds) 参数解释 text :

  • Android开发实现消除屏幕锁的方法

    本文实例讲述了Android开发实现消除屏幕锁的方法.分享给大家供大家参考,具体如下: 实现屏幕无锁--->当我们开机或者超过锁屏幕时间或按电源键之后屏幕没有锁的一种状态. 经过查询许多资料以及分析代码,我们可以发现最主要的屏幕功能还是在framework/base/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java中. 里面有一个handleshow方法: 真正的去锁屏实现有一个 handlehide方法,

  • Android Button按钮点击背景和文字变化操作

    Android 原生的按钮点击状态是有变化的,但是如果是自己加了一个.png格式的图片为背景色,按钮点击就不会有任何效果,为了达到点击按钮有一闪的效果,我们就需要准备两张图进行切换, 而且文字也要变色,老规矩废话不多说直接上代码: 按钮背景图片放在 drawable/background_button.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="h

随机推荐