分散对齐

3 篇文章 0 订阅
2 篇文章 0 订阅

TextView分散对齐(左右对齐)

今天在做Android TextView实现左右对齐(分散对齐)排版,查了网上的资料,国内大部分都没有深究,有一款可以实现分散对齐的开源对齐TextView还是通过自定义控件重写onDraw方法实现的,达不到我们的要求。
但是在一个文章中找到了思路,虽然原文上面的代码效率低,并且无法正常使用,哈哈。

本人代码远程连接

以下是代码

/**
* 使用字符串间添加空格实现左右对齐(分散对齐)
*/
public class TextJustification {

	public static void justify(TextView textView) {
    	float contentWidth = textView.getWidth() - textView.getPaddingRight() - textView.getPaddingLeft();
    	String text = textView.getText().toString();
        Paint paint = textView.getPaint();
    	StringBuilder resultText = new StringBuilder();

    	String[] paraArray = paraBreak(text, textView);

    	for (int i = 0; i < paraArray.length; i++) {
        	if (TextUtils.isEmpty(paraArray[i])) {
            	resultText.append("\n");
            	continue;
        	}
        	ArrayList<String> lineList = lineBreak(paraArray[i].trim(), paint, contentWidth);
        	String paraText = TextUtils.join("\n", lineList);
        	resultText.append(paraText);
        	if (i != paraArray.length - 1) {
            	resultText.append("\n");
        	}
    	}

    	textView.setText(resultText.toString());
	}

	//分开每个段落
	private static String[] paraBreak(String text, TextView textview) {
    	return text.split("\\n");
	}

	//分开每一行,使每一行填入最多的单词数
	private static ArrayList<String> lineBreak(String text, Paint paint, float contentWidth) {
    	String[] wordArray = text.split("\\s");

    	ArrayList<String> lineList = new ArrayList<>();
    	StringBuilder myText = new StringBuilder();


    	for (String word : wordArray) {
        	if (paint.measureText(myText + " " + word) <= contentWidth) {
            	if (myText.length() >= 1)
                	myText.append(" ");
            	myText.append(word);
        	} else {
            	int totalSpacesToInsert = (int) ((contentWidth - paint.measureText(myText.toString())) / paint.measureText(" "));
            	if (!TextUtils.isEmpty(myText.toString())) {
                	lineList.add(justifyLine(myText.toString(), totalSpacesToInsert));
                	myText.delete(0, myText.length());
            	}
            	myText.append(word);
        	}
    	}
    	lineList.add(myText.toString());
    	return lineList;
	}

	public static boolean isChinese(String str) {
    	String reg = "[\\u4e00-\\u9fa5]+";
    	return str.matches(reg);// 根据正则判断
	}

	//已填入最多单词数的一行,插入对应的空格数直到该行满
	private static String justifyLine(String text, int totalSpacesToInsert) {
    	if (TextUtils.isEmpty(text)) {
        	return "";
    	}
    	String[] wordArray = text.split("\\s");
    	StringBuilder stringBuilder = new StringBuilder();

    	int nullCount = 0;
    	for (String word : wordArray) {
        	if (TextUtils.isEmpty(word)) {
            	nullCount++;
        	}
    	}

    	int realLength = wordArray.length - nullCount;
    	int spaceTime = 0, reminderNum = totalSpacesToInsert;

    	if (0 != realLength - 1) {
        	spaceTime = totalSpacesToInsert / (realLength - 1);//每个单词间隔几个空格
        	reminderNum = totalSpacesToInsert % (realLength - 1);//余数
    	}
    	stringBuilder.append(wordArray[0]);

    	int nullIndex = 0;
    	for (int i = 1; i < wordArray.length; i++) {
        	if (TextUtils.isEmpty(wordArray[i])) {
            	stringBuilder.append(wordArray[i]);
            	nullIndex++;
            	continue;
        	}
        	for (int i1 = 0; i1 < spaceTime; i1++) {
                stringBuilder.append(" ");//先添加spaceTime个空格
        	}
        	if (reminderNum >= i - nullIndex) {
            	stringBuilder.append("  ");//两个空格
            	stringBuilder.append(wordArray[i]);
        	} else {
                stringBuilder.append(" ");//一个空格
            	stringBuilder.append(wordArray[i]);
        	}
    	}

    	return stringBuilder.toString();
	}
}

可以看到思路就是用空格进行对齐,详细思路是先将字符串分段,之后按段落计录每行字符,计算并添加每行需要的空格,最后重设给textView。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值