--解决TextView换行排版混乱问题--网上找到一个不错的方法--分享给大家

通过自定义TextView控件----

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);
	}

	@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‘;
		}
	}

}
时间: 2024-11-06 03:45:07

--解决TextView换行排版混乱问题--网上找到一个不错的方法--分享给大家的相关文章

jade 网上看到一个不错的demo 分享 一下 链接

http://download.csdn.net/detail/sarah1992/9347903 启动的时候 先启动 http://localhost:8080/ 在 node chat 启动 http://localhost:8080/stooges/chat 这样 就可以了. 神奇的聊天开始了

前段时间一直不知道怎么学习,在网上找到一篇好文章分享给在路上的产品经理

如果你也是一枚刚入门的交互设计师,是不是常有这样一种感觉:不知从何下手,闷头读了一大堆书.学了一大堆软件.画了一大堆图之后还是感觉心里不踏实,总害怕自己还缺点什么,恨不得要有本<交互设计学习大纲>就好了.出现这个问题有两个原因,一是交互设计师没有可视性强的产物,交互设计师的产物一般是线框图.流程图.信息架构图.说明文档等等,但这些东西既不如视觉设计稿华丽精美,也不如程序代码高贵冷艳,在外行人看来初级交互设计师和高级交互设计师画的好像都差不多,轻易看不出你修炼到了几层功力;第二个原因是交互设计是

[debug] 解决在C++编写过程中的“找到一个或多个多重定义的符号”

如下图: 其在 common.h 中定义了一个变量a ,然后在两个 cpp 文件中都是用它. 在这种情况下,链接时就会出现 “找到一个或多个多重定义的符号”. 解决方案: 在某个cpp文件中定义,然后在 common.h 中是用 extern 在外部声明这个变量. 建立:变量的定义建立放在cpp中,在 头文件中加一个 extern 即可. 原文地址:https://www.cnblogs.com/onetrainee/p/11961511.html

TextView中英文排版混乱

TextView问题由来 TextView在中英文夹杂的时候,会出现自动断行的情况,相信许多人都碰见过.这是系统的一个Bug,在Android5.0以后被修复了,而5.0以下的还没有见到比较好的解决版本. 参考了网上的方法,有的朋友推荐使用全角和半角转换(没有解决问题),也有的推荐了JustifyTextView这个控件(效果也不理想). 于是我决定自定义一个TextView来做这件事,勉强解决了问题,但是代价是失去了很多TextView自身拥有的特性,而且TextView自身做了很多缓存和优化

解决TextView换行异常问题

在用TextView显示一段中文时发现会提前换行,用网上搜索到的方案都解决不了,最终选择用EditText代替之 <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:enabled="false" android:background="@null"/> 原文地址:https://www

解决VS2010无法打开,提示无法找到atl100.dll的方法

这个问题是卸载VS2010一些组件造成的误删问题,且从网上下的atl100.dll通常与自己的VS2010不符 解决方法: 从路径:C:\Program Files\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.ATL 下拷贝atl100.dll到路径:C:\WINDOWS\system32下

NodeJs教程(介绍总结!)终于在网上找到一个靠谱点的了T_T

本人吐槽!本人是学渣,然后网上关于nodeJS的大多都是坑,简直让人要奔溃了.若非最近总是被要求要nodeJS,坚决不会去碰的...天生对cmd命令觉得无比的高大上,尽管一直在用git版本控制器!然后我也和估计和看此文的小白们同一起点,如果有node大神,跪求传授必杀技,吐槽完毕! 首先无非就是什么是NodeJS? 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱

快讯:黑客找到一个破解虹膜生物安全系统的简单方法

尽管生物扫描技术依然存在不少如信息隐私安全和人身隐私安全方面令人担忧的地方,关系到个人唯一身份识别信息如视网膜,虹膜,指纹和DNA方面的生物安全系统依然在欣欣向荣的往前发展以使得我们可以过上更好的生活. 在过去几年,指纹安全识别系统被广泛应用到如智能手机和司法系统应用上面来记录用户信息和作为用户唯一身份识别方法.广大的安全研究工作者对它所带给人们的担忧都曾经视而不见,而现今,虹膜扫描安全系统却承认自己被打得一败涂地(这该是多么讽刺的一件事情). 别怕!其实破解的方式并不是如大家在电影上所看到的由

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

其实在TextView中遇到排版自动换行而导致混乱不堪的情况是非常常见的,而且导致这种问题产生的原因就是英文和中文混合输入,半角字符和全角字符混合在一起了.一般情况下,我们输入的数字.字母以及英文标点都是半角字符,所以占位无法确定,它们与汉字的占位不同,由于这个原因,导致很多文字的排版都是参差不齐的. 原因找到了,自然解决方法就来了,一般有以下两种方法来解决这种问题. 1.将TextView中的字符全角化.即将所有的数字.字母及标点全部转为全角字符,使它们与汉字同占两个字节,这样就可以避免由于占