package com.hupu.games.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.util.TypedValue; import android.widget.TextView; import com.hupu.games.common.HupuLog; /** * * @author zhenhua * */ public class AutoTextView extends TextView { private Paint paint; private float cTextSize; private CharSequence preText=""; public AutoTextView (Context context, AttributeSet attrs) { super(context, attrs); paint = new Paint(); paint.set(this.getPaint()); } /** * 将文字缩放到合适大大小 * @param maxLineText 文本中最长的一行的长度 * @param viewWidth TextView的宽度 * @param linenum 文本的行数 */ private void refitText(String maxLineText,String allText,int linenum) { int viewWidth=this.getWidth(); int viewHeight=this.getHeight(); HupuLog.e(this.getClass().getName(), "refitText===text="+maxLineText+",viewWidth="+viewWidth+",viewHeight="+viewHeight+",linenum="+linenum); if (viewWidth > 0) { //获得当前TextView的有效宽度 int widthspace=10; int heightspace=10; if(linenum==2 ){ widthspace=30; heightspace=30; }else if(linenum==1){ widthspace=15; heightspace=20; if(allText.length()==1){//1个字符 widthspace=60; heightspace=60; }else if(allText.length()==2){//2个字符 widthspace=30; heightspace=30; } } int availableWidth = viewWidth - this.getPaddingLeft() - this.getPaddingRight()-widthspace; int availableHeight = viewHeight - this.getPaddingTop() - this.getPaddingBottom()-heightspace; HupuLog.e(this.getClass().getName(), "availableWidth="+availableWidth+",availableHeight = "+availableHeight); float[] widths = new float[maxLineText.length()]; Rect rect = new Rect(); paint.getTextBounds(maxLineText, 0, maxLineText.length(), rect); //所有字符串所占像素宽度 // int textWidths = rect.width(); float textWidths = getTextWidth(paint,maxLineText); float textHeight = rect.height()*linenum; HupuLog.e(this.getClass().getName(), "Rect==="+rect); cTextSize = this.getTextSize();//这个返回的单位为px HupuLog.e(this.getClass().getName(), "befor change === cTextSizepre="+cTextSize+",textWidths="+textWidths+",textHeight="+textHeight+",paint.size="+paint.getTextSize()); if(textWidths > availableWidth || textHeight > availableHeight){ while(textWidths > availableWidth || textHeight > availableHeight){//大了变小 HupuLog.e(this.getClass().getName(), "宽高变小中 = textWidths="+textWidths+",textHeight="+textHeight); cTextSize = cTextSize - 1; float[] wh = textChange(maxLineText, widths,rect,linenum); textWidths=wh[0]; textHeight=wh[1]; } }else if(textWidths < availableWidth && textHeight < availableHeight){ while(textWidths < availableWidth && textHeight < availableHeight){//变小大了 HupuLog.e(this.getClass().getName(), "宽度变大中 = textWidths="+textWidths+",textHeight="+textHeight); cTextSize = cTextSize + 1; float[] wh = textChange(maxLineText, widths,rect,linenum); textWidths=wh[0]; textHeight=wh[1]; } //微调 if(textWidths > availableWidth-4 || textHeight > availableHeight-4){ HupuLog.e(this.getClass().getName(), "微调前 = textWidths="+textWidths+",textHeight="+textHeight+"cTextSize="+cTextSize); cTextSize = cTextSize - 1; float[] wh = textChange(maxLineText, widths,rect,linenum); textWidths=wh[0]; textHeight=wh[1]; } HupuLog.e(this.getClass().getName(), "微调后 = textWidths="+textWidths+",textHeight="+textHeight+","+cTextSize); } HupuLog.e(this.getClass().getName(), "cTextSize_after="+cTextSize); this.setTextSize(TypedValue.COMPLEX_UNIT_PX, cTextSize);//这里制定传入的单位是px } }; private float[] textChange(String maxLineText,float[] widths,Rect rect,int linenum){ HupuLog.e(this.getClass().getName(), "befor textchage = "+paint.getTextSize()+","+paint.measureText(maxLineText)); float[] wh=new float[2]; setTextSize(TypedValue.COMPLEX_UNIT_PX, cTextSize);//这里制定传入的单位是px paint.setTextSize(cTextSize);//这里传入的单位是px rect = new Rect(); paint.getTextBounds(maxLineText, 0, maxLineText.length(), rect); // 所有字符串所占像素宽度 // int textWidths = rect.width(); float textWidths=getTextWidth(paint,maxLineText); // int textWidths = paint.getTextWidths(text, widths); float textHeight = rect.height()*linenum; wh[0]=textWidths; wh[1]=textHeight; HupuLog.e(this.getClass().getName(), "after textchage = "+paint.getTextSize()+","+paint.measureText(maxLineText)+","+textWidths); return wh; } private float getTextWidth(Paint paint, String str) { float 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]); } */ iRet = paint.getTextSize()*str.length(); } return iRet; } /** * 取出多行数据中最长的一行来做缩放 * @param text * @param textWidth textview长度 */ private void refitAvalableText(String text, int viewWidth){ HupuLog.e(this.getClass().getName(), "refitAvalableText====>viewWidth="+viewWidth+",text="+text); String[] linetext = text.split("\n"); int maxWidth=0; int usefullline=-1; if(linetext != null && linetext.length>0){ for(int i=0;i<linetext.length;i++){ Rect rect = new Rect(); paint.getTextBounds(linetext[i], 0, linetext[i].length(), rect); int lineWidth =rect.width(); HupuLog.e(this.getClass().getName(), "lineWidth="+lineWidth+",maxWidth="+maxWidth); if(lineWidth>maxWidth){ maxWidth = lineWidth; usefullline=i; } } if(usefullline>=0){ refitText(linetext[usefullline],text,linetext.length); } } } @Override protected void onDraw(Canvas canvas) { if(!getText().equals(preText)){ refitAvalableText(getText().toString(), getWidth()); preText = getText(); } super.onDraw(canvas); } }