Android用View实现显示中英文混排的文字
2010-09-10 12:49
483 查看
/**
* 分隔获取的要显示的字符串,保存在string数组
*
* @param aStr
* String 输入的字符串
* @param aFont
* Font 字体
* @param aRowMaxW
* 一行的最大宽度
* @return String[]
*/
public static String[] clipString(String aStr, Paint aPaint, int aRowMaxW ) {
if (aStr == null) {
return null;
}
int lineNum = 0;
if (aRowMaxW < aPaint.measureText("学")) {
aRowMaxW = (int) aPaint.measureText("学");
// System.out.println("charWidth: " + aFont.charWidth('学'));
}
int sStrID = 0;// 字符串中每个字的标记
StringBuffer sStringBuffer = null;
int sRowWidth = 0;// 一行中当前字的宽度
Vector sStrManager = new Vector();
char sChar = ' ';
int spacePos = 0;
while (sStrID < aStr.length()) {
sChar = aStr.charAt(sStrID);
// Log.i("------"+line,lineNum+"++++");
switch (sChar) {
case '/r':
case '/n':// 遇到换行的时候
if (sStrID > 0) {
sStrManager.addElement(aStr.substring(0, sStrID));
lineNum++;
if (lineNum == line) {
if (aScreenWidth > 0) {
aRowMaxW = aScreenWidth - 10;
}
}
// Log.i("n+++++",lineNum+"++++");
}
aStr = aStr.substring(sStrID + 1);// 取回/n后面的字符
sRowWidth = 0;// 把下一行的字的现有宽度设为0
sStrID = 0;// 把剩下的字首个字的下标重新定义为0
break;
case ' ':
spacePos = sStrID; // 当出现英文单词截断时,刚好保存截断前面一个空格的位置
sRowWidth += aPaint.measureText(String.valueOf(sChar));
sStrID++;
break;
case '/t':
sStringBuffer = new StringBuffer(aStr);
sStringBuffer.deleteCharAt(sStrID);
sStringBuffer.insert(sStrID, " ");
aStr = sStringBuffer.toString();
sRowWidth += aPaint.measureText(" ");
sStrID++;
break;
default:
if (sRowWidth + aPaint.measureText(String.valueOf(sChar)) > aRowMaxW - 15) { // 如果文字的宽度超过手机屏幕的宽度,要进行换行。
// 如果截断位置是两个 ASCII 字符,且后一个不是空格。表明是在英文单词当中进行的截断
// 则需要查找最后一个空格的出现位置
if ((aStr.charAt(sStrID - 1) > 0)
&& (aStr.charAt(sStrID - 1) < 128)
&& (aStr.charAt(sStrID) > 0)
&& (aStr.charAt(sStrID) < 128)
&& (aStr.charAt(sStrID) != ' ')) {
sStrID = spacePos;
}
sStrManager.addElement(aStr.substring(0, sStrID));
lineNum++;
aStr = aStr.substring(sStrID);
sStrID = 0;
sRowWidth = 0;
} else {
sRowWidth += aPaint.measureText(String.valueOf(sChar));
sStrID++;
}
break;
}
}
sStrManager.addElement(aStr);
// sStrManager.addElement(" "); //加多一个空白行
String reStr[] = new String[sStrManager.size()];
sStrManager.copyInto(reStr);// 把strManager里的字符复制到新定义的reStr[]数组中
return reStr;
}
* 分隔获取的要显示的字符串,保存在string数组
*
* @param aStr
* String 输入的字符串
* @param aFont
* Font 字体
* @param aRowMaxW
* 一行的最大宽度
* @return String[]
*/
public static String[] clipString(String aStr, Paint aPaint, int aRowMaxW ) {
if (aStr == null) {
return null;
}
int lineNum = 0;
if (aRowMaxW < aPaint.measureText("学")) {
aRowMaxW = (int) aPaint.measureText("学");
// System.out.println("charWidth: " + aFont.charWidth('学'));
}
int sStrID = 0;// 字符串中每个字的标记
StringBuffer sStringBuffer = null;
int sRowWidth = 0;// 一行中当前字的宽度
Vector sStrManager = new Vector();
char sChar = ' ';
int spacePos = 0;
while (sStrID < aStr.length()) {
sChar = aStr.charAt(sStrID);
// Log.i("------"+line,lineNum+"++++");
switch (sChar) {
case '/r':
case '/n':// 遇到换行的时候
if (sStrID > 0) {
sStrManager.addElement(aStr.substring(0, sStrID));
lineNum++;
if (lineNum == line) {
if (aScreenWidth > 0) {
aRowMaxW = aScreenWidth - 10;
}
}
// Log.i("n+++++",lineNum+"++++");
}
aStr = aStr.substring(sStrID + 1);// 取回/n后面的字符
sRowWidth = 0;// 把下一行的字的现有宽度设为0
sStrID = 0;// 把剩下的字首个字的下标重新定义为0
break;
case ' ':
spacePos = sStrID; // 当出现英文单词截断时,刚好保存截断前面一个空格的位置
sRowWidth += aPaint.measureText(String.valueOf(sChar));
sStrID++;
break;
case '/t':
sStringBuffer = new StringBuffer(aStr);
sStringBuffer.deleteCharAt(sStrID);
sStringBuffer.insert(sStrID, " ");
aStr = sStringBuffer.toString();
sRowWidth += aPaint.measureText(" ");
sStrID++;
break;
default:
if (sRowWidth + aPaint.measureText(String.valueOf(sChar)) > aRowMaxW - 15) { // 如果文字的宽度超过手机屏幕的宽度,要进行换行。
// 如果截断位置是两个 ASCII 字符,且后一个不是空格。表明是在英文单词当中进行的截断
// 则需要查找最后一个空格的出现位置
if ((aStr.charAt(sStrID - 1) > 0)
&& (aStr.charAt(sStrID - 1) < 128)
&& (aStr.charAt(sStrID) > 0)
&& (aStr.charAt(sStrID) < 128)
&& (aStr.charAt(sStrID) != ' ')) {
sStrID = spacePos;
}
sStrManager.addElement(aStr.substring(0, sStrID));
lineNum++;
aStr = aStr.substring(sStrID);
sStrID = 0;
sRowWidth = 0;
} else {
sRowWidth += aPaint.measureText(String.valueOf(sChar));
sStrID++;
}
break;
}
}
sStrManager.addElement(aStr);
// sStrManager.addElement(" "); //加多一个空白行
String reStr[] = new String[sStrManager.size()];
sStrManager.copyInto(reStr);// 把strManager里的字符复制到新定义的reStr[]数组中
return reStr;
}
相关文章推荐
- Android UI设计之<六>使用HTML标签,实现在TextView中对部分文字进行加粗显示
- Android基于ViewFilpper实现文字LED显示效果示例
- Android之TextView实现文字过长时省略部分或者滚动显示
- Android----Android之TextView实现文字过长时省略部分或者滚动显示 (跑马灯)
- AndroidTextView实现文字竖直显示
- Android之TextView实现文字过长时省略部分或者滚动显示
- Android之TextView实现文字过长时省略部分或者滚动显示
- 【转】Android之TextView实现文字过长时省略部分或者滚动显示
- Android自定义TextView实现文字图片居中显示
- Android之TextView实现文字过长时省略部分或者滚动显示
- Android自定义TextView实现文字图片居中显示的方法
- Android的TextView实现文字高亮显示和显示表情
- Android之TextView实现文字过长时省略部分或者滚动显示
- android显示TextView文字的倒影效果实现代码
- Android之TextView实现文字过长时省略部分或者滚动显示
- Android之TextView实现文字过长时省略部分或者滚动显示
- Android之TextView实现文字过长时省略部分或者滚动显示
- Android之TextView实现文字过长时省略部分或者滚动显示
- Android实现在TextView文字过长时省略部分或滚动显示的方法
- Android之TextView实现文字过长时省略部分或者滚动显示