最近在做着一个项目,里边会显示很长的一段文字,但是这些文字并不会整齐地排列,遇到文字中带有中英文时,果断给我换行了,好无语..接着就是不断地百度百度,找到了一堆一两年前的东西,不是叫你半角转全角,就是中文符号转英文符号,还有一些自定义TextView的试过了效果也不满意,最后在一个Android开发群中才得知JustifyTextView

        GitHub地址:https://github.com/ufo22940268/android-justifiedtextview

借用一下原图:

英文:

中文:

最后是自定义TextView的代码(从GitHup中下载的JustifyTextView有一个小Bug,最后一行显示的文字间距太大,在Issues(https://github.com/ufo22940268/android-justifiedtextview/issues/1)中作者也告知了如何解决,只是Githup代码中未更新,这里的代码已做出了修改):

[java] view plaincopy
  1. import android.content.Context;
  2. import android.graphics.Canvas;
  3. import android.graphics.Paint;
  4. import android.text.Layout;
  5. import android.text.StaticLayout;
  6. import android.text.TextPaint;
  7. import android.util.AttributeSet;
  8. import android.widget.TextView;
  9. /**
  10. * @author ccheng
  11. * @Date 3/18/14
  12. */
  13. public class JustifyTextView extends TextView {
  14. private int mLineY;
  15. private int mViewWidth;
  16. public static final String TWO_CHINESE_BLANK = "  ";
  17. public JustifyTextView(Context context, AttributeSet attrs) {
  18. super(context, attrs);
  19. }
  20. @Override
  21. protected void onLayout(boolean changed, int left, int top, int right,
  22. int bottom) {
  23. super.onLayout(changed, left, top, right, bottom);
  24. }
  25. @Override
  26. protected void onDraw(Canvas canvas) {
  27. TextPaint paint = getPaint();
  28. paint.setColor(getCurrentTextColor());
  29. paint.drawableState = getDrawableState();
  30. mViewWidth = getMeasuredWidth();
  31. String text = getText().toString();
  32. mLineY = 0;
  33. mLineY += getTextSize();
  34. Layout layout = getLayout();
  35. // layout.getLayout()在4.4.3出现NullPointerException
  36. if (layout == null) {
  37. return;
  38. }
  39. Paint.FontMetrics fm = paint.getFontMetrics();
  40. int textHeight = (int) (Math.ceil(fm.descent - fm.ascent));
  41. textHeight = (int) (textHeight * layout.getSpacingMultiplier() + layout
  42. .getSpacingAdd());
  43. //解决了最后一行文字间距过大的问题
  44. for (int i = 0; i < layout.getLineCount(); i++) {
  45. int lineStart = layout.getLineStart(i);
  46. int lineEnd = layout.getLineEnd(i);
  47. float width = StaticLayout.getDesiredWidth(text, lineStart,
  48. lineEnd, getPaint());
  49. String line = text.substring(lineStart, lineEnd);
  50. if(i < layout.getLineCount() - 1) {
  51. if (needScale(line)) {
  52. drawScaledText(canvas, lineStart, line, width);
  53. } else {
  54. canvas.drawText(line, 0, mLineY, paint);
  55. }
  56. } else {
  57. canvas.drawText(line, 0, mLineY, paint);
  58. }
  59. mLineY += textHeight;
  60. }
  61. }
  62. private void drawScaledText(Canvas canvas, int lineStart, String line,
  63. float lineWidth) {
  64. float x = 0;
  65. if (isFirstLineOfParagraph(lineStart, line)) {
  66. String blanks = "  ";
  67. canvas.drawText(blanks, x, mLineY, getPaint());
  68. float bw = StaticLayout.getDesiredWidth(blanks, getPaint());
  69. x += bw;
  70. line = line.substring(3);
  71. }
  72. int gapCount = line.length() - 1;
  73. int i = 0;
  74. if (line.length() > 2 && line.charAt(0) == 12288
  75. && line.charAt(1) == 12288) {
  76. String substring = line.substring(0, 2);
  77. float cw = StaticLayout.getDesiredWidth(substring, getPaint());
  78. canvas.drawText(substring, x, mLineY, getPaint());
  79. x += cw;
  80. i += 2;
  81. }
  82. float d = (mViewWidth - lineWidth) / gapCount;
  83. for (; i < line.length(); i++) {
  84. String c = String.valueOf(line.charAt(i));
  85. float cw = StaticLayout.getDesiredWidth(c, getPaint());
  86. canvas.drawText(c, x, mLineY, getPaint());
  87. x += cw + d;
  88. }
  89. }
  90. private boolean isFirstLineOfParagraph(int lineStart, String line) {
  91. return line.length() > 3 && line.charAt(0) == ' '
  92. && line.charAt(1) == ' ';
  93. }
  94. private boolean needScale(String line) {
  95. if (line == null || line.length() == 0) {
  96. return false;
  97. } else {
  98. return line.charAt(line.length() - 1) != '\n';
  99. }
  100. }
  101. }

JustifyTextView 解决TextView中英文混排排版问题,android文字排版不齐,相关推荐

  1. JustifyTextView 解决TextView中英文混排自动换行的问题

    最近在做着一个项目,里边会显示很长的一段文字,但是这些文字并不会整齐地排列,遇到文字中带有中英文时,果断给我换行了,好无语..接着就是不断地百度百度,找到了一堆一两年前的东西,不是叫你半角转全角,就是 ...

  2. 解决Android TextView中英文混排换行问题

    文章目录 个人极不建议这样做(之后会说原因) 1 现象 2 解决思路 3不推荐的原因 个人极不建议这样做(之后会说原因) 1 现象 绿色底黄色框内的就是原生TextView出现的情况,出现这种情况的主 ...

  3. TextView解决中英文混排自动换行

    自定义TextView解决中英文混排自动换行的问题 Textview中设置中英文混合格式的字符串时会自动换行,本文就是解决这个问题的办法,废话不多说直接上代码 点击查看原文: 代码 import an ...

  4. html中英文混排,EndNote中英文混排时et al和等的3种解决方法 | 科研动力

    EndNote对于英文文献的处理很出色,但是对于中文文献的处理就有点别扭,尤其是中英文文献混排时更是不爽.木有关系,EndNote的强大这处之一就是可以驯服和调教.下面介绍3种如何处理中英文混排时et ...

  5. 参考文献名称怎么复制_[Zotero+Word]Zotero+Word2016参考文献中英文混排,解决et al和等的问题...

    注: 参考文献是用chinese-gb7714-1987-...或chinese-gb7714-2005-...等csl生成的参考文献,也就是英文作者超过3个后面是"等". 其他参 ...

  6. 【转】Endnote中英文混排及输出作者全名的解决办法

    有的期刊在文章发表时要求期刊名及作者名都需要为全名,不能用省略简写名.那么这个一般的设置是很容易的,具体步骤如下: 第一步,这里以<植物遗传资源学报>的格式为例,打开Endnote后,点击 ...

  7. EndNote中英文混排时et al和等的3种解决方法

    EndNote对于英文文献的处理很出色,但是对于中文文献的处理就有点别扭,尤其是中英文文献混排时更是不爽.木有关系,EndNote的强大这处之一就是可以驯服和调教.下面介绍3种如何处理中英文混排时et ...

  8. EndNote中英文混排时et al和等的解决方法

    EndNote对于英文文献的处理很出色,但是对于中文文献的处理就有点别扭,尤其是中英文文献混排时更是不爽.木有关系,EndNote的强大这处之一就是可以驯服和调教.下面介绍3种如何处理中英文混排时et ...

  9. EndNote 高校_EndNote引文格式修改全攻略(一)——中英文混排问题

    虽然今年受疫情影响较大,但大部分毕业生还是要在家码论文的.说到毕业论文,就必定要有格式修改,但对一些科研老手来讲可能论文修改也不一定能玩的很溜. 今天小编先带大家带来论文格式修改的第一部分内容,教你解 ...

最新文章

  1. putchar函数的基本格式
  2. android编译产生的apk或so不安装 .
  3. Linux命令 查看文件中指定行号的内容
  4. 项目管理(五)- 风险检测表
  5. commonjs 和 es6模块化开发入门
  6. 读取P12格式证书的密钥
  7. MySQL INFORMATION_SCHEMA信息数据库
  8. ppt手动放映怎么设置_PPT如何设置幻灯片自动播放免除手动一张一张的点击
  9. IDEA搜索插件时显示search results are not loaded check the internet connection解决办法
  10. linux sox录音时间控制,SOX的一些命令和kaldi使用sox音频数据增强
  11. 自学报告:创新设计思维
  12. SAP MM 常见移动类型及定义
  13. Java基础(32)
  14. GPS标准历书Yuma,Rinex,TLE,SEM是什么意思?
  15. web入侵二之弱口令攻击及其他
  16. GMT北京时间表示的时间算法
  17. 判断质数和合数python代码_「质数和合数」C语言:质数和合数的判断 - 金橙教程网...
  18. CF1455A 题解
  19. WinPE启动U盘的制作方法与软件下载(通用PE工具箱/老毛桃/大白菜WinPE)
  20. StreamReader和StreamWriter 的使用

热门文章

  1. 最有可能成为第五个一线城市,苏州 or 杭州?
  2. response—Http协议response响应详解刨析
  3. windows安装gensim
  4. 支付设计白皮书:支付系统的路由系统设计
  5. Tomcat配置与调优
  6. CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲
  7. darknet转caffe
  8. Hibernate第三讲:Hibernate主键策略和Hibernate的查询方案
  9. 题目: 哈夫曼编码大全
  10. matlab 三维y轴平面图,#如何在excel中绘制三维坐标系?#excel怎么画图平面坐标图...