在app中,展示数据时,里面有汉字、数字、特殊字符时,由于全角、半角问题导致TextView参差不齐。在网上找了许多,半角转全角并没什么用,还有其他自定义TextView都有问题。最后终于找到一个,就像Word一样,可以使文字左右两端对齐:

@SuppressLint("AppCompatCustomView")
public class JustifyTextView extends TextView {private int mLineY;private int mViewWidth;public static final String TWO_CHINESE_BLANK = " ";public JustifyTextView(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);}@Overrideprotected 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出现NullPointerExceptionif (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';}}
}

效果:

Android 解决TextView排版参差不齐的问题相关推荐

  1. android 自定义view文字不齐,Android 解决TextView排版参差不齐的问题

    Android 解决TextView排版参差不齐的问题 在app中,展示数据时,里面有汉字.数字.特殊字符时,由于全角.半角问题导致TextView参差不齐.在网上找了许多,半角转全角并没什么用,还有 ...

  2. 解决TextView排版混乱或者自动换行的问题

    解决TextView排版混乱或者自动换行的问题 参考文章: (1)解决TextView排版混乱或者自动换行的问题 (2)https://www.cnblogs.com/android-blogs/p/ ...

  3. Android自定义TextView排版优化

    今天的文章关于android中最常用的的控件Textview,安卓中的TextView在文字布局的时候会在每行的末尾进行智能的换行分割,特别是有标点符号等出现的时候.这个规律是怎样的我至今还没有探究过 ...

  4. android settext内容乱码,Android解决TextView setText显示乱码

    TextView在setText会因为编码的问题出现乱码的情况,以下是一些解决方案的记录. 1.在程序中对组件setText出现中文乱码,统一为UTF-8也没解决这个问题. 2.在build.grad ...

  5. Android 解决TextView使用shader无故有透明度

    现象 使用paint.shader实现渐变文字时,发现文字有透明度,开始代码里明明没有设置.paint画笔的透明度也是255正常. 解决方案 如果没有给TextView设置默认的颜色,会有一个有透明度 ...

  6. android textview参差不齐,android textView 排版显示参差不齐的解决方法

    参考Github的方法 试了试,效果不错 代码如下: import android.content.Context; import android.graphics.Canvas; import an ...

  7. JustifyTextView 解决TextView中英文混排排版问题,android文字排版不齐,

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

  8. Android AutoWrapTextView 解决中英文排版问题

    Android AutoWrapTextView 解决中英文排版问题 参考文章: (1)Android AutoWrapTextView 解决中英文排版问题 (2)https://www.cnblog ...

  9. Android 解决Android的TextView和EditText换行问题

    Android 解决Android的TextView和EditText换行问题 参考文章: (1)Android 解决Android的TextView和EditText换行问题 (2)https:// ...

最新文章

  1. CUDA Samples: Streams' usage
  2. Stringtie进行转录本组装和定量
  3. Linux下配置SSL (转)
  4. Swift 扩展存储属性
  5. 北京大力度建设城市绿道,我们身边处处是风景
  6. 《SpringBoot揭秘:快速构建微服务体系》—第2章2.4节本章小结*
  7. mysql删除默认密码_修改mysql默认密码方法
  8. wxWidgets:wxGridSizeEvent类用法
  9. 买无线路由还是买无线AP?
  10. 法语写信_为我们写信:我们最热门的19个主题
  11. 午夜时分的51CTO博客与白天有什么不同?
  12. 在linux添加驱动程序,linux下静态/动态加载驱动的两种方式
  13. 课堂笔记 Numpy酒鬼漫步
  14. Python爬取De下载站相关代码
  15. 蓝桥杯之二阶魔方旋转
  16. 什么叫工业4.0,这篇接地气的文章终于讲懂了
  17. 一些Pixel手机的使用技巧
  18. 登录模块与token的使用和创建
  19. matlab进行光纤耦合,MATLAB单模光纤与多模光纤耦合仿真
  20. rtt 使用fal时出现找不到分区表问题

热门文章

  1. Flash媒体服务器
  2. Tensorflow2.0 利用LSTM和爬虫做自动生成七言律诗
  3. 使用Encoder-Decoder模型自动生成对联的思路
  4. 奇数阶魔方阵算法分析
  5. 力扣OJ 剑指 Offer(1-30)
  6. 内网渗透:八、CVE-2020-1472 NetLogon 域内提权漏洞(域控密码置空)
  7. 如何调整图片像素大小
  8. java中ASCII与中文互转
  9. Android项目从零到上线的全过程
  10. SPR1: Spring简介