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

时间:2022-03-16 11:01:15
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 的字间距