搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Cpp五条
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
40 个 CSS 布局技巧_css布局思路
2
一款好用的AI工具——边界AICHAT(二)_边界ai-chat桌面版
3
ISO27001体系建立中的风险评估方法_iso27005风险评估打分
4
文本生成项目(第二步摘要生成)
5
C#/Java 动态生成电子发票_发票代码规则 c#
6
c++排序算法——冒泡排序(不会的一定要看,超级详细)_c++冒泡排序
7
浏览器全屏相关常用代码_浏览器全屏代码
8
手把手教你用鸿蒙HarmonyOS实现微信聊天界面(二)_鸿蒙系统可以按照message吗
9
鸿蒙开发-UI-组件导航-Tabs
10
WebSocket 和SSE的区别以及优缺点_股票行情推送用sse还是websocket
当前位置:
article
> 正文
Android自定义view-文本自动换行
作者:Cpp五条 | 2024-03-15 16:28:47
赞
踩
Android自定义view-文本自动换行
转自:http://gundumw100.iteye.com/blog/1420725 感谢这位朋友
今天忽然发现android项目中的文字排版参差不齐的情况非常严重,不得不想办法解决一下。经过研究之后,终于找到了textview自动换行导致混乱的原因了----半角字符与全角字符混乱所致!一般情况下,我们输入的数字、字母以及英文标点都是半角,所以占位无法确定。它们与汉字的占位大大的不同,由于这个原因,导致很多文字的排版都是参差不齐的。对此我找到了两种办法可以解决这个问题:
1. 将textview中的字符全角化。即将所有的数字、字母及标点全部转为全角字符,使它们与汉字同占两个字节,这样就可以避免由于占位导致的排版混乱问题了。 半角转为全角的代码如下,只需调用即可。
Java代码
/**
* 半角转换为全角
*
* @param input
* @return
*/
public
static
String ToDBC(String input) {
char
[] c = input.toCharArray();
for
(
int
i =
0
; i < c.length; i++) {
if
(c[i] ==
12288
) {
c[i] = (
char
)
32
;
continue
;
}
if
(c[i] >
65280
&& c[i] <
65375
)
c[i] = (
char
) (c[i] -
65248
);
}
return
new
String(c);
}
2. 去除特殊字符或将所有中文标号替换为英文标号。利用正则表达式将所有特殊字符过滤,或利用replaceAll()将中文标号替换为英文标号。则转化之后,则可解决排版混乱问题。
Java代码
/**
* 去除特殊字符或将所有中文标号替换为英文标号
*
* @param str
* @return
*/
public
static
String stringFilter(String str) {
str = str.replaceAll(
"【"
,
"["
).replaceAll(
"】"
,
"]"
)
.replaceAll(
"!"
,
"!"
).replaceAll(
":"
,
":"
);
// 替换中文标号
String regEx =
"[『』]"
;
// 清除掉特殊字符
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
return
m.replaceAll(
""
).trim();
}
解决之前层次不齐的排版截图:
解决之后的整齐排版,如下图:
Android自定义view-文本自动换行
文本自动换行原理:文本超出控件宽度后,自动换到下一行绘制。
实现代码:
Java代码
protected
void
onDraw(Canvas canvas) {
FontMetrics fm = mPaint.getFontMetrics();
float
baseline = fm.descent - fm.ascent;
float
x =
0
;
float
y = baseline;
//由于系统基于字体的底部来绘制文本,所有需要加上字体的高度。
String txt = getResources().getString(com.orgcent.demo.R.string.hello);
//文本自动换行
String[] texts = autoSplit(txt, mPaint, getWidth() -
5
);
System.out.printf(
"line indexs: %s\n"
, Arrays.toString(texts));
for
(String text : texts) {
canvas.drawText(text, x, y, mPaint);
//坐标以控件左上角为原点
y += baseline + fm.leading;
//添加字体行间距
}
}
Java代码
/**
* 自动分割文本
* @param content 需要分割的文本
* @param p 画笔,用来根据字体测量文本的宽度
* @param width 最大的可显示像素(一般为控件的宽度)
* @return 一个字符串数组,保存每行的文本
*/
private
String[] autoSplit(String content, Paint p,
float
width) {
int
length = content.length();
float
textWidth = p.measureText(content);
if
(textWidth < = width) {
return
new
String[]{content};
}
int
start =
0
, end =
1
, i =
0
;
int
lines = (
int
) Math.ceil(textWidth / width);
//计算行数
String[] lineTexts =
new
String[lines];
while
(start < length) {
if
(p.measureText(content, start, end) > width) {
//文本宽度超出控件宽度时
lineTexts[i++] = (String) content.subSequence(start, end);
start = end;
}
if
(end == length) {
//不足一行的文本
lineTexts[i] = (String) content.subSequence(start, end);
break
;
}
end +=
1
;
}
return
lineTexts;
}
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Cpp五条/article/detail/242875
推荐阅读
article
Android
Studio
完全卸载_
android
studio
卸载...
Android
Studio
完全卸载_
android
studio
卸载
android
studio
卸载 ...
赞
踩
article
Android
Studio
如何卸载干净?_
android
studio
卸载干净...
想要卸载
Android
Studio
?跟着步骤做,还愁卸载不干净?_
android
studio
卸载干净
android
...
赞
踩
article
android
小球绕外
圆
旋转
_
android
圆
弧
旋转
动画
...
android
小球绕外
圆
旋转
_
android
圆
弧
旋转
动画
android
圆
弧
旋转
动画
/**...
赞
踩
article
android
按钮
背景
色的
渐变
效果实现
_
android
渐变
按压
背景
...
<?xml version="1.0" encoding="utf-8"?><shape ="http...
赞
踩
article
android
关于使用retrofit2.0的一些问题_
kanzi
android
$
use
js...
1. 请求这样的格式时:http:IP地址/?action=""必须在@GET(“/”) 添加"/" 如果添加在base...
赞
踩
article
Android
studio
中的
BuildConfig
类_
android
studio
buildc...
Android
studio
中的
BuildConfig
类_
android
studio
buildconfigandro...
赞
踩
article
Android
Studio
中如何自定义
Android
BuildConfig
配置文件_androi...
一个project会有多个app,不同module中都要配置compileSdkVersion、
build
ToolsVe...
赞
踩
article
2022.3.1
Android
studio
创建新的工程时没有
语言
选项_
android
studi...
在使用新版
Android
studio
创建Empty Activity工程时会遇到没有
语言
选项,默认创建的工程是。这时我...
赞
踩
article
Android
Studio
4
以上版本设置成中文_
android
studio
4
.1
汉化包...
Android
Studio
工具汉化_
android
studio
4
.1
汉化包
android
studio
4
.1
汉化...
赞
踩
article
Android
studio
无法创建
Android
项目 根本就
没有
这个选项_androidstud...
今天突然遇到这个问题,搞得也郁闷
的
虽然问题很久了,但是今天刚好遇到了,就来回答一下,万一别
的
同学也遇到
的
话可以来看看:如...
赞
踩
article
andro
id
studio
的
语言
设置
在哪,
andro
id
studio
0.3.2中的
语言
级别
设置
...
andro
id
studio
0.3.2中的
语言
级别
设置
是什么?(What does
the
language
leve...
赞
踩
article
Android
studio
无法创建
Android
项目 根本就
没有
这个选项_
andriod
stu...
虽然问题很久了,但是今天刚好遇到了,就来回答一下,万一别的同学也遇到的话可以来看看:如图,点击setting--》plu...
赞
踩
article
Android
Studio
自带模拟器解决
中文
输入
问题以及将模拟器内语言改成
中文
_
android
s...
setting内找到Language–>点击最上面的选项–>添加简体
中文
(中国)–>添加完成后点击右边两道横杠处将其移动...
赞
踩
article
Android
Studio
如何
实现软件
英文
变
中文
教程_
androidstadio
怎么设置
成
中文
...
Android
Studio
是一款功能强大的集
成
开发环境(IDE),用于开发
Android
应用程序。默认情况下,Andr...
赞
踩
article
Android
Studio
无法输入中文_
android
studio
无法输入中文...
在
Android
Studio
安装目录的bin文件夹下找到
studio
.bat文件,复制一份到桌面,打开编辑,在第二行增...
赞
踩
article
Android
Studio
Iguana
| 2023.2.1
版本
_
android
studio
...
Android
Studio
Iguana
| 2023.2.1
版本
和IntelliJ IDEA 2023 .2 平台更...
赞
踩
article
Android
Studio
无法
输入
中文问题的处理(
Mac
&
Windows
)...
网上搜了一下,大多数文章的解决方案是替换jre,这显然不是一个好办法。另外还有一个办法是,编辑bin目录下的studio...
赞
踩
article
Android
studio
Gradle
下载
失败,如何手动配置解决该问题详解_
android
st...
今天在打开公司一个项目时,突然要重新
下载
相关的
gradle
,不知道
Android
studio
抽了什么风哈哈哈,但是一直...
赞
踩
article
Android
6.0
以后
系统
输入
法
IME不支持
中文
输入
的
解决办法
_
输入
法
安卓
6.0
...
本人从2011年进入android 车载定制
系统
行业,从事
Android
车载
系统
定制相关软件开发,从
Android
2....
赞
踩
article
android
输入
框不可
输入
中
文
,
Android
学习笔记 ——
Android
开发
中
,限制 Ed...
今天在练习开发一个小项目的时候,需要限制
EditText
输入
框不能
输入
中
文
(汉字),在网上找了很多例子,结合自己的实...
赞
踩
相关标签
android studio
android
android-studio
gradle
windows
ide
android studio的语言设置在哪
macos