为了下次方便搜查,贴一下代码
isGo=true; final Paint paint = new Paint(); paint.setTextSize(tv_detail.getTextSize()); Rect rect = new Rect(); //精确计算文字宽度 tv_detail.post(new Runnable() { @Override public void run() { tvWidth = tv_detail.getWidth(); textWidth = getTextWidth(paint, test); if (textWidth>tvWidth * 4 - tvWidth / 2){ img_detail_more.setVisibility(View.VISIBLE); showText = test.substring(0, subInex(paint, test)); tv_detail.setText(showText + "..."); }else { img_detail_more.setVisibility(View.GONE); } } }); img_detail_more.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { isGo = !isGo; if(isGo){ tv_detail.setText(test); }else { tv_detail.setText(showText + "..."); } } }); } public static int getTextWidth(Paint paint, String str) { int iRet = 0; if (str != null && str.length() > 0) { int len = str.length(); float[] widths = new float[len]; paint.getTextWidths(str, widths); for (int j = 0; j < len; j++) { iRet += (int) Math.ceil(widths[j]); } } return iRet; } //需要截取的位置 public int subInex(Paint paint, String str) { int iRet = 0; int j = 0; if (str != null && str.length() > 0) { int len = str.length(); float[] widths = new float[len]; paint.getTextWidths(str, widths); for (j = 0; j < len; j++) { iRet += (int) Math.ceil(widths[j]); if (iRet > tvWidth * 4 - tvWidth / 2) { break; } } } return j; }