一、问题描述:

Android的TextView在显示文字的时候,如果有段中文有英文,有中文,有中文标点符号,你会发现,当要换行的时候遇到中文标点,

这一行就会空出很多空格出来。原因是:

1) TextView在显示中文的时候 标点符号不能显示在一行的行首和行尾,如果一个标点符号刚好在一行的行尾,该标点符号就会连同前一个字符跳到下一行显示;

2)一个英文单词不能被显示在两行中( TextView在显示英文时,标点符号是可以放在行尾的,但英文单词也不能分开 );

3)全角和半角的问题,汉字无论全角还是半角都是占2个字节,英文和符号在半角是占一个字节,全角是占两个字节。

二、解决方法

参考资料中:http://niufc.iteye.com/blog/1729792

可能由于时间问题,都没有很好解决我的问题。将textview中的字符全角化没有效果,去除特殊字符或将所有中文标号替换为英文标号。这个有点效果,但是产品经理说文案不符合标准。改源代码担心出问题,影响其他的应用。自定义TextView时,canvas.setViewport()这个方法的api被删了。然后各种百度查资料,很多都是转过来转过去。然并卵。后面找了好久才找到一个靠谱的。完美的解决了我的问题。

自定义TextView(直接把代码拷进去就能用)

package com.lhx.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.TextView;

/**
* @author lhx
* @Date 9/8/15
*/
public class MyTextView extends TextView {

private int mLineY;
private int mViewWidth;

public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
}

@Override
protected void onDraw(Canvas Canvas) {
TextPaint paint = getPaint();
paint.setColor(getCurrentTextColor());
paint.drawableState = getDrawableState();
mViewWidth = getMeasuredWidth();
String text = getText().toString();
mLineY = 0;
mLineY += getTextSize();
Layout layout = getLayout();

// layout.getLayout()在4.4.3出现NullPointerException
if (layout == null) {
return;
}

Paint.FontMetrics fm = paint.getFontMetrics();

int textHeight = (int) (Math.ceil(fm.descent - fm.ascent));
textHeight = (int) (textHeight * layout.getSpacingMultiplier() + layout
.getSpacingAdd());
//解决了最后一行文字间距过大的问题
for (int i = 0; i < layout.getLineCount(); i++) {
int lineStart = layout.getLineStart(i);
int lineEnd = layout.getLineEnd(i);
float width = StaticLayout.getDesiredWidth(text, lineStart,
lineEnd, getPaint());
String line = text.substring(lineStart, lineEnd);

if(i < layout.getLineCount() - 1) {
if (needScale(line)) {
drawScaledText(Canvas, lineStart, line, width);
} else {
Canvas.drawText(line, 0, mLineY, paint);
}
} else {
Canvas.drawText(line, 0, mLineY, paint);
}
mLineY += textHeight;
}
}

private void drawScaledText(Canvas Canvas, int lineStart, String line,
float lineWidth) {
float x = 0;
if (isFirstLineOfParagraph(lineStart, line)) {
String blanks = " ";
Canvas.drawText(blanks, x, mLineY, getPaint());
float bw = StaticLayout.getDesiredWidth(blanks, getPaint());
x += bw;

line = line.substring(3);
}

int gapCount = line.length() - 1;
int i = 0;
if (line.length() > 2 && line.charAt(0) == 12288
&& line.charAt(1) == 12288) {
String substring = line.substring(0, 2);
float cw = StaticLayout.getDesiredWidth(substring, getPaint());
Canvas.drawText(substring, x, mLineY, getPaint());
x += cw;
i += 2;
}

float d = (mViewWidth - lineWidth) / gapCount;
for (; i < line.length(); i++) {
String c = String.valueOf(line.charAt(i));
float cw = StaticLayout.getDesiredWidth(c, getPaint());
Canvas.drawText(c, x, mLineY, getPaint());
x += cw + d;
}
}

private boolean isFirstLineOfParagraph(int lineStart, String line) {
return line.length() > 3 && line.charAt(0) == ' '
&& line.charAt(1) == ' ';
}

private boolean needScale(String line) {
if (line == null || line.length() == 0) {
return false;
} else {
return line.charAt(line.length() - 1) != '\n';
}
}

}

<!--工作时间提醒-->
<LinearLayout
android:layout_width="match_parent"
android:id="@+id/ll_chat"
android:background="@color/topbar_chat"
android:layout_height="wrap_content">
<com.lhx.widget.MyTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_reminder"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_marginRight="8dp"
android:layout_marginLeft="8dp"
android:text = "服务商不管以任何形式要求线下交易,都存在诈骗的风险,请提高警惕。This is test!欢迎相互关注。有不对的地方望指出和包容。谢谢! "
android:textColor="@color/text_orange_1"/>
</LinearLayout>

以上就很好的解决了TextView中英文字符排版的问题,折腾了好久终于搞定。希望对您有点帮助。

转载于:https://www.cnblogs.com/lenkevin/p/8940237.html

Android的TextView在显示文字的时候,如果有段中文有英文,有中文,有中文标点符号,你会发现,当要换行的时候遇到中文标点, 这一行就会空出很多空格出来...相关推荐

  1. Android自定义Textview 蒙语显示(蒙古文字)

    Android自定义Textview 蒙语显示(蒙古文字) 竖排Textview 自动换行 从左到右 蒙语字体包 demo下载地址 https://download.csdn.net/download ...

  2. android app 原生 小米手机 TextView 不显示文字

    长春子问:"在android 原生app 开发中,发现在小米手机运行, TextView 里的文字 不显示,一片空白.而在其他品牌手机上可以正常显示". 如图: 代码如下: < ...

  3. android中TextView分段显示不同颜色,字体,时间

    例子1: 设置部分文字背景高亮显示: Java代码 public class HighLightActivity extends Activity {           String strs=&q ...

  4. android:TextView中显示平方米符号㎡

    第一次写博客有点小激动,主要还是想把自己遇到的问题记录下来,也为了帮助到更多遇到这个问题的朋友. 正题:在TextView中显示平方米的符号即㎡ 解决过程:刚开始的时候是直接写上了m2,但始终看着不爽 ...

  5. android TextView 不显示文字

    问题描述 在xml布局文件中已经定义了TextView的颜色android:textColoe="xxxxx"然后在Java文件中根据需要动态改变TextView字体的颜色text ...

  6. RecyclerView嵌套TextView时显示文字不全的解决方法之一

    先描述一下这个小bug:简单的TextView嵌套RecyclerView作为itemView时,可能会在文本中出现布局覆盖的现象,itemView的布局其实很简单,就是一个RelativeLayou ...

  7. android 中TextView设置部分文字背景色和文字颜色

    通过SpannableStringBuilder来实现,它就像html里边的元素改变指定文字的文字颜色或背景色 public class MainActivity extends Activity { ...

  8. Android 一个TextView中设置文字不同字体大小和颜色的最完整方法

    在做项目的时候,经常会遇到过一行文字有两种颜色.有时候直接会想到用多个TextView来实现.今天就介绍一下更为简单的方法,用一个TextView实现. 效果: 这几个都实现了一行字有不同颜色,还有两 ...

  9. Android 关于TextView 默认显示英文字母大写问题

    开发问题记录了一下,TextView小写 字母总是显示为大写的问题通过查阅资料 解决方法: 在xml中设置 android:textAllCaps="false"即可

最新文章

  1. 对AI行业未来发展的一些看法
  2. JAVA ee6 result结果集_java对数据库的表插入操作时,显示已生成用于更新的结果集...
  3. Myeclipse启动Tomcat服务器Address already in use: JVM_Bind
  4. 拓端tecdat|R语言回归中的Hosmer-Lemeshow拟合优度检验
  5. VC++2010开发数字图像系统1
  6. Linux-Grep命令详解
  7. Macbook鼠标调节外接显示器亮度 - Shades for Mac(屏幕亮度调节软件) V1.2 苹果电脑版
  8. C语言利用getchar()与while循环解决跳步问题
  9. 【最优化导论】一维搜索方法
  10. 计算机设备不能正常启动怎么办,电脑没有找到可引导设备怎么办
  11. kthreaddk病毒查杀记录
  12. TJA1050 引脚
  13. 怎么查看电脑磁盘的分区是GPT还是MBR
  14. 5-8 SpringBoot拦截器的使用
  15. 关于间皮瘤mesothelioma的相关信息
  16. 漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼?
  17. 《微型计算机原理与接口技术》复习笔记(一)
  18. 为什么说全球疫情的刺激,加快了AI视频智能分析技术的需求?
  19. Verilog设计“111”检测器与“01110”检测器并测试所有情况
  20. Gox脚本的各种执行方式-GX2

热门文章

  1. 现代计算机网络的6个方面的应用,现代计算机网络技术应用及发展(共4384字).doc...
  2. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...
  3. leetcode44. 通配符匹配 又是一道没有解释的字符串dp困难题
  4. leetcode165. 比较版本号 超级重要的细节
  5. Android设计模式之——单例模式
  6. 专访刘伟:软件开发人员的内功修炼之道
  7. 网站性能优化的三重境界
  8. Tiny Core Linux 4.5 发布,微型 Linux 操作系统
  9. fread rb与r,wb,w的区别
  10. FFMpeg的output_example.c例子分析