Android TextView 横排文字变竖排的简单方法

TextView 并没有提供文字竖排的方法。在网上搜了一下,只找到一些相对复杂的解决方案(比如继承重写View组件的绘制方法)。而我需要的仅仅是将数据集中取得的两行汉字按竖排格式输出即可。类似下面的需求:
从数据库或字符数组中随机获取的字符串——
    路见不平一声吼,\n 你不喝酒谁喝酒?
该字符串中间已加有换行符(\n),如果直接显示到 TextView 则效果如下——
    路见不平一声吼,
     你不喝酒谁喝酒?
而我们希望的效果如下——
    路 你
    见 不
    不 喝
    平 酒
    一 谁
    声 喝
    吼 酒
    , ?
稍作分析发现,对于行数有限的文本来说,其实只需将字符串看作一个方形字符陈列,再将其“行列转置”(借用 Excel 里面的一个概念)即可达成我们的目标。
再简单点说,就是将每行8个字符共两行的文本,转换成每行两个字符共8行的文本。
下面是转置方法——
	/* 
         * 功能:多行横排文本转换为多列直排(以换行符 \n 作为断行标记)
         * 说明:可支持1~N行,但要求有换行标记符,或稍作修改以标点符号换行
         * @author: 云冰工作室 yunbing.com
         * @param: strText
         * @return: 返回值为行列转置后的多行文本
         */
	public static String getTextHtoV(String strText){
		String strResult = "";
		String br = "\n";      //断行标记,这里可改用逗号或分号等字符
		String strArr[] = strText.split(br);
		int nMaxLen = 0;      //各行最多字符数
		int nLines = strArr.length;    //总共的行数
		char charArr[][] = new char[nLines][];    //字符陈列(即二维数组)
		for (int i = 0; i < nLines; i++) {
			String str = strArr[i];
			int n = str.length();

                        //以最长的行的字符数(即原列数)作为目标陈列的行数
			if (n > nMaxLen) nMaxLen = n; 
			charArr[i] = strArr[i].toCharArray();
		}
		
		//行列转换
		for (int i = 0; i < nMaxLen; i++) {			
			for (int j = 0; j < nLines; j++) {
                                //若短句字符已“用完”则以空格代替
				char c = i < charArr[j].length ? charArr[j][i] : ' ';
				strResult += String.valueOf(c);

                //两列文字之间加空格,不需要的话请注释掉下面一行
                if (j < nLines - 1) strResult += " ";  //★
			}
			strResult += br;   //添加换行符
		}
		
		return strResult;
	}


方法引用例——
        String strText = strTalks[nArrId];    //从字符数组或数据库读取字符串
        strText = Util.getTextHtoV(strText);  //行列转换
        textView.setText(strText);    //显示到TextView


另,上述代码中标记  ★  的语句,是为了避免两列文字过于拥挤而增加的列间空格符,简单隔开各列。
原本希望通过控制 TextView 的字间距,但当前版本的 Android 似乎并未提供相应方法。
搜索网上发现不少“教程”声称可以利用 TextView 的  setTextScaleX() 方法设置字间距,但从字面上(Scale)就可看出其实它是用于设置字体的缩放比率(试验结果亦是如此)。
若有需要调节字间距的朋友,可参考我的另一文章:
Android 中如何调节 TextView 的字间距

你可能感兴趣的:(Android,Java)