//这个方法我已经修改了,完全可用
package com.example.camerademo.utils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.util.Log;
public class EllpsizeUtils_DingChang {
/**
* 字符串的单个字符是否是汉字
*
* @param c
* 单个字符
* @return 字符对应的ASCIIS 值, 负值 是汉字;
*/
public static int ascii(String c) {
byte x[] = new byte[2];// 这里是两个元素
x = c.getBytes();// 按照原有的 编码格式生成字节数组;
// x=c.getBytes("utf-8");// 按照什么编码格式生成 字节数组;
// x=c.getBytes(srcBegin, srcEnd, dst, dstBegin);
if (x == null || x.length > 2 || x.length <= 0) {// 没有字符,为空字符串(空格也是字符串)
return -1;
}
if (x.length == 1) {// 英文字符
return 1;
}
Pattern p=Pattern.compile("[\u4e00-\u9fa5]");
Matcher m=p.matcher(c);
if(m.matches()){
// Toast.makeText(Main.this,"输入的是汉字", Toast.LENGTH_SHORT).show();
return -1;
}
return 0;
}
/**
* 去掉首位空格,做其它处理
*
* @param string
* @return
*/
public static String goodStr(String string) {
string = string.trim();
return string;
}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> * 判断 有多少个 汉字 长度 取整数
<span style="white-space:pre"> </span> * @param string
<span style="white-space:pre"> </span> * @return
<span style="white-space:pre"> </span> */
public static int letterSum(String string) {
if (null != string) {
string = goodStr(string);// 这个函数是干什么用处的?去掉 首位空格
if (string.length() <= 0) {
return 0;
} else {
String str;
double len = 0;
for (int i = 0; i < string.length(); i++) {
// 是否是汉字 ascii<0;
str = string.substring(i, i + 1);
if (ascii(str) < 0) {
len++;
} else {
len += 0.5;
}
}
Log.e("num", (int) Math.round(len)+"; len="+ len);
return (int) Math.round(len);
}
}
return 0;
}
/**
* 获取 多少的 字符串
*
* @param string
* 字符串数据,
* @param size
* 要获取的长度 ( 是长度 不是字符个数,是长度):中文为一个,英文为0.5个
* 注意:假设有十个长度:全为中文,则为10个汉字;20个字母, 若某字符串字符数小于 10,则该字符串没有达到省略要求;
* @return
*/
public static String limitStr(String string, int size) {// 要多长的 字符串
if (null != string) {
string = goodStr(string);// 这个函数是干什么用处的?去掉 首位空格
if (string.length() <= size) {
return string;
} else {
StringBuffer buffer = new StringBuffer();
String str;
double len = 0;
for (int i = 0; i < string.length(); i++) {
// 是否是汉字 ascii<0;
str = string.substring(i, i + 1);
if (ascii(str) < 0) {
buffer.append(str);
len++;
} else {
buffer.append(str);
len += 0.5;
}
if (len >= size)
break;
}
return buffer.toString();
}
}
return "";
}
/**
* 获取 以特定 字符串endStr 为结尾的字符串,
*
* @param strData 字符串数据
* @param size
* @param endStr
* @return 返回以特定省略符号为结尾的字符串
*/
public static String limitStr_Ending(String strData, int size, String endStr) {
strData = goodStr(strData);//去掉首位空格
if (size < endStr.length() || strData.length() < endStr.length()) {// 结尾的字符串过长,子以
// 结尾的字符串为主
Log.e("endStr is too long","endStr is too long! Please cut it.");
}
String cutStr;
cutStr = limitStr(strData, size);
if (cutStr.length()!=strData.length()) {//如果字符串被裁减了 则执行下面操作
cutStr = cutStr.substring(0, cutStr.length() - letterSum(endStr))+ endStr;
}
return cutStr;
}
}
另一个方法是我自己写,但是没上面那个好:
我使用的是第三个方法,在使用的时候传入的dp值和你的dp小点(-10dp):public static String textEllpsize(TextView textContent,String textStr,Context context,int dp) 这个方法成熟,前面两个不成熟,
package com.example.camerademo.utils;
import android.R.integer;
import android.content.Context;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.Log;
import android.view.View.MeasureSpec;
import android.widget.TextView;
//(textview_content);
public class EllipsizeUtils {
private static int getAvailableWidth(TextView folder_library) {
return folder_library.getWidth() - folder_library.getPaddingLeft()
- folder_library.getPaddingRight();// 控件宽度-左边内间距-右边内间距==TextView的内容间距
}
public static boolean isOverFlowed(TextView folder_library) {
TextPaint paint = folder_library.getPaint();
float widthPaint = paint.measureText(folder_library.getText().toString().trim());// 获取字符串的长度(距离,不是字符个数)
// Log.e("widthPaint WidthTextView",
// "widthPaint = "+widthPaint+
// " WidthTextView = "+getAvailableWidth(folder_library));
if (widthPaint >= getAvailableWidth(folder_library))
return true;
//还有一种情况会出现,就是 数字符串很长,还是会出现一个点,下面的方法 已经解决了
return false;
}
/**
* 使用方法:
* 1.把 xml 的 Ellpsize 去掉,Singleline=true
* 3.传入一个有内容的 TextView,若字符串过长,设置成指定 省略符号的字符串
*
* @param textContent
*/
// public static void textEllpsize(TextView textContent) {
// if (TextUtils.isEmpty(textContent.getText())) {
// return;
// }
//
//
// // 获得 首尾没有空格的字符串 的长度
// String strEllpsize = textContent.getText().toString().trim();
// Log.e("啊啊111111textEllpsize=", strEllpsize);
// if (isOverFlowed(textContent)) {
// int indexLocation=getAvailableWidth(textContent);
// System.out.println("indexlocation:" + indexLocation);
// TextPaint paint = textContent.getPaint();
// System.out.println("paint:"+paint);
// String ellipsizeStr = TextUtils.ellipsize(strEllpsize,paint, indexLocation,TextUtils.TruncateAt.END).toString();//
// Log.e("啊啊222222textEllpsize=", ellipsizeStr+"*********");
String ellipsizeStr2 = ellipsizeStr.substring(0, ellipsizeStr.length()- 3) + "***";// 如何获取开始 省略位置的脚标
//
// // 此时将TextView 设置成指定省略 符号的 字符串
// textContent.setText(ellipsizeStr);
// Log.e("nowEllpsizeContent", "nowEllpsizeContent = "+ellipsizeStr);
// }
// }
public static String textEllpsize(TextView textContent,String textStr,Context context,int dp) {
// if (textContent!=null) {
textStr="";
// return "";
// }
int defaultDP=200;
if (dp>0) {
defaultDP =dp;
}
float scale = context.getResources().getDisplayMetrics().density;
// int widthPx=200*2;
float widthPx=defaultDP*scale + 0.5f;
Log.e("*widthPx*********", "widthPx = "+widthPx+"textStr = "+textStr+"scale = "+scale);//800.5 400
TextPaint paint = textContent.getPaint();
textStr=textStr.trim();
float strwidth = paint.measureText(textStr);
Log.e("*strwidth***widthPx******", strwidth+"**********"+widthPx);
if (strwidth > widthPx){
// 根据长度截取出剪裁后的文字 *0.8
String ellipsizeStr = (String) TextUtils.ellipsize(textStr, paint, widthPx*0.9f,TextUtils.TruncateAt.END);
// Log.e("*ellipsizeStr******","=="+ellipsizeStr);
ellipsizeStr=ellipsizeStr.substring(0, ellipsizeStr.length()-3)+"...";
Log.e("*ellipsizeStr******","=="+ellipsizeStr);
return ellipsizeStr;
}
return textStr;
}
}