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)就可看出其实它是用于设置字体的缩放比率(试验结果亦是如此)。
若有需要调节字间距的朋友,可参考我的另一文章: