Android AutoWrapTextView 解决中英文排版问题

1.概述

最近项目有新需求,UED给了个卡券密码的UI样式,如图:

我一看很简单啊,一个TextView解决问题,然后做好以后在模拟器里一看.....

纳尼,这个时候才想起来,TextView 中英文在一起会有排版问题,那怎么解决呢......

思路

刚开始的想法是一个字符一个字符的去绘制,绘制到最右边的临界点就换行绘制,结果实践以后发现不同的字符之间的间距不一样,显示会非常凌乱,又没有什么好的方案解决这个间距问题,所以这个方案pass;

单个字符绘制不行那就一行一行绘制,根据View的长度把文本拆分成N行,然后一行一行的绘制。

2.实现

首先创建一个继承自View的AutoWrapTextView

init方法里分别调用了initStyle方法和initPaint方法;

initStyle方法主要解析自定义的属性

属性名含义都很明显不用过多解释,initPaint方法就是初始化一个文本画笔

接下来我们看看设置文本的方法setText方法

首先把文本转换成Char数组,然后循环数组把整个文本拆分成N行文本,下面来看看核心方法splitText方法

首先创建一个属性名为mSplitTextList的List集合用来存放拆分的文本;
mSingleTextWidth 为单行文本显示的宽度;

currentSingleTextWidth 为当前一行累计计算的宽度;

然后开始循环Char数组,getSingleCharWidth方法就是计算单个Char的宽度;
如果currentSingleTextWidth 小于 mSingleTextWidth 就把Char添加到lineStringBuffer 当中,如果是最后一个Char就直接把lineStringBuffer添加到mSplitTextList集合当中

如果currentSingleTextWidth 大于 mSingleTextWidth,就把lineStringBuffer添加到mSplitTextList集合当中,重新给lineStringBuffer赋值,currentSingleTextWidth 归0;

循环结束以后拆分好的文本就都添加到mSplitTextList集合当中了。

拆分完成以后循环mSplitTextList集合,得到每一行文本的Rect值,绘制文本的时候会用到,然后设置View的宽高。

接下来就是绘制方法drawText

首先得到第一行文本距离顶部的高度marginTop,然后循环文本绘制每一行文本内容。

 
效果图

我们来看下最后的效果

至此整个类的逻辑分析就结束了,想看完整源码的可以移步:

https://github.com/chenpengfei88/AutoWrapTextView

时间: 2024-11-05 01:02:07

Android AutoWrapTextView 解决中英文排版问题的相关文章

sdk manager 创建的虚拟机启动的时候总是在Android字样解决

一直显示Android字样,只需要删除目录下的snapshots.img 找到sdk的目录下的\tools\lib\emulator,然后删除上面的文件snapshots.img即可,我的sdk路径是下面的,所以进入这里杀出它就好了 D:\adt-bundle-windows-x86-20140321\adt-bundle-windows-x86-20140321\sdk\tools\lib\emulatorsdk manager 创建的虚拟机启动的时候总是在Android字样解决,布布扣,bu

图片--Android有效解决加载大图片时内存溢出的问题

Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView

在VC中创建两套资源解决中英文版本发布的问题

原文http://blog.csdn.net/ylforever/article/details/6745611 一.背景 当软件需要发布多个不同语言版本时,对资源编辑的菜单,按钮,对话框大小形状有不同的要求.比如同个单词用中文/英文描述字符长度差异较大,如果这个单词 用作按钮的标题,对按钮的大小要求就不一样.这时可以有两种解决方法:1.通过代码动态调整按钮的大小,较麻烦,也破坏了VC资源编辑所见即所得规则. 2.准备两套资源,编译不同的版本用不同的资源.下面重点描述第二种处理方法的详细步骤.

Android开发--解决AndroidADT开发工具不能代码提示的问题

google android的新的开发工具,打开以后没有代码自动提示功能,下面对ADT工具的一些配置: 1.设置代码的字体 设置JAVA文件代码的字体:我这里设置的14 常规. 2.设置XML文件中代码的字体: 3.设置代码编辑器的背景颜色 色调85.饱和度90.亮度205 RGB:199.237.204 自定义: 4.设置代码提示功能: 快捷方式:Alt + /    可以出现代码提示. 默认的只有输入“ .” 以后才会有代码补全提示,可作如下设置: java->content Assist-

Android:解决Gradle DSL method not found: 'runProguard()' 问题

将Android Studio升级至最新版(1.0 RC 4)之后,运行项目时出现问题: Gradle DSL method not found: 'runProguard()' 从字面就能看出来,出现这个问题的原因是找不到runProguard()这个方法了(调用这个方法的地方在每个Module对应的build.gradle文件中). 这是因为,当Android Studio升级时,也自动的将项目下的build.gradle文件(不是Module对应的build.gradle!)下的内容修改成

Android Studio 解决更新慢的问题

Android Studio 解决更新慢的问题 最近在一些群里有伙伴们反应工具更新慢,由于国内网络对google限制的原因,android studio更新一直是个老大难的问题,为了,提高sdk下载的速度,我们更改原因的下载网址,改成国内的镜像地址,这样就不用vpn,也同样可以较快的更新!就把自己当时,配置的步骤再整理下! 一,更新sdk慢 打开settings 其中在 sdk update sites中把默设的 勾全部去掉,在其他下面添加国内的镜像地址: true http://ubuntu.

android ButterKnife 解决重复findViewById

简介: 程序员都是懒惰的,不想写一大堆像下面这样的代码 class ExampleActivity extends Activity { TextView title; TextView subtitle; TextView footer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_ac

Android:解决cannot find zipalign的问题

如果当前使用的Android SDK是v20的话,在通过Eclipse或者Intellij IDEA打包Android项目时,会出现一个”cannot find zipalign”的错误. 这个错误的原因在于google将zipalign程序移动到了build-tools/android-4.4W目录中.要解决这个问题,最简单的方法就是将这个文件copy到和build-tools同级的tools目录下就可以了. Android:解决cannot find zipalign的问题

Android 中解决输入法挡住输入框的问题

android 中解决输入法挡住输入框的问题 大家在布局时候,有时候会发现输入框被挡住一部分,能完全显示出来,但是系统自带短信界面可以完全漂浮在软键盘之上,看了一下短信源码,修改一下输入模式就可以了,源码如下代码方式: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 也可以简