Android 解决TextView排版参差不齐的问题
在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排版参差不齐的问题相关推荐
- android 自定义view文字不齐,Android 解决TextView排版参差不齐的问题
Android 解决TextView排版参差不齐的问题 在app中,展示数据时,里面有汉字.数字.特殊字符时,由于全角.半角问题导致TextView参差不齐.在网上找了许多,半角转全角并没什么用,还有 ...
- 解决TextView排版混乱或者自动换行的问题
解决TextView排版混乱或者自动换行的问题 参考文章: (1)解决TextView排版混乱或者自动换行的问题 (2)https://www.cnblogs.com/android-blogs/p/ ...
- Android自定义TextView排版优化
今天的文章关于android中最常用的的控件Textview,安卓中的TextView在文字布局的时候会在每行的末尾进行智能的换行分割,特别是有标点符号等出现的时候.这个规律是怎样的我至今还没有探究过 ...
- android settext内容乱码,Android解决TextView setText显示乱码
TextView在setText会因为编码的问题出现乱码的情况,以下是一些解决方案的记录. 1.在程序中对组件setText出现中文乱码,统一为UTF-8也没解决这个问题. 2.在build.grad ...
- Android 解决TextView使用shader无故有透明度
现象 使用paint.shader实现渐变文字时,发现文字有透明度,开始代码里明明没有设置.paint画笔的透明度也是255正常. 解决方案 如果没有给TextView设置默认的颜色,会有一个有透明度 ...
- android textview参差不齐,android textView 排版显示参差不齐的解决方法
参考Github的方法 试了试,效果不错 代码如下: import android.content.Context; import android.graphics.Canvas; import an ...
- JustifyTextView 解决TextView中英文混排排版问题,android文字排版不齐,
最近在做着一个项目,里边会显示很长的一段文字,但是这些文字并不会整齐地排列,遇到文字中带有中英文时,果断给我换行了,好无语..接着就是不断地百度百度,找到了一堆一两年前的东西,不是叫你半角转全角,就是 ...
- Android AutoWrapTextView 解决中英文排版问题
Android AutoWrapTextView 解决中英文排版问题 参考文章: (1)Android AutoWrapTextView 解决中英文排版问题 (2)https://www.cnblog ...
- Android 解决Android的TextView和EditText换行问题
Android 解决Android的TextView和EditText换行问题 参考文章: (1)Android 解决Android的TextView和EditText换行问题 (2)https:// ...
最新文章
- CUDA Samples: Streams' usage
- Stringtie进行转录本组装和定量
- Linux下配置SSL (转)
- Swift 扩展存储属性
- 北京大力度建设城市绿道,我们身边处处是风景
- 《SpringBoot揭秘:快速构建微服务体系》—第2章2.4节本章小结*
- mysql删除默认密码_修改mysql默认密码方法
- wxWidgets:wxGridSizeEvent类用法
- 买无线路由还是买无线AP?
- 法语写信_为我们写信:我们最热门的19个主题
- 午夜时分的51CTO博客与白天有什么不同?
- 在linux添加驱动程序,linux下静态/动态加载驱动的两种方式
- 课堂笔记 Numpy酒鬼漫步
- Python爬取De下载站相关代码
- 蓝桥杯之二阶魔方旋转
- 什么叫工业4.0,这篇接地气的文章终于讲懂了
- 一些Pixel手机的使用技巧
- 登录模块与token的使用和创建
- matlab进行光纤耦合,MATLAB单模光纤与多模光纤耦合仿真
- rtt 使用fal时出现找不到分区表问题