/* * Copyright (C) 2012 www.amsoft.cn * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.ab.util; import java.util.ArrayList; import java.util.List; import android.graphics.Canvas; import android.graphics.Paint.FontMetrics; import android.text.Layout; import android.text.TextPaint; // TODO: Auto-generated Javadoc /** * © 2012 amsoft.cn * 名称:AbGraphic.java * 描述:图形处理类. * * @author 还如一梦中 * @version v1.0 * @date:2013-01-17 下午11:52:13 */ public final class AbGraphicUtil { /** * 描述:获取字符的所在位置(按像素获取最大能容纳的). * * @param str 指定的字符串 * @param maxPix 要取到的位置(像素) * @param paint the paint * @return 字符的所在位置 */ public static int subStringLength(String str,int maxPix,TextPaint paint) { if(AbStrUtil.isEmpty(str)){ return 0; } int currentIndex = 0; for (int i = 0; i < str.length(); i++) { //获取一个字符 String temp = str.substring(0, i + 1); float valueLength = paint.measureText(temp); if(valueLength > maxPix){ currentIndex = i-1; break; }else if(valueLength == maxPix){ currentIndex = i; break; } } //短于最大像素返回最后一个字符位置 if(currentIndex==0){ currentIndex = str.length()-1 ; } return currentIndex; } /** * 描述:获取文字的像素宽. * * @param str the str * @param paint the paint * @return the string width */ public static float getStringWidth(String str,TextPaint paint) { float strWidth = paint.measureText(str); return strWidth; } /** * 获得文字的宽度 * @param str the str * @param paint the paint * @return the string width */ public static float getDesiredWidth(String str,TextPaint paint) { float strWidth = Layout.getDesiredWidth(str, paint); return strWidth; } /** * 获取文字的高度 * @param paint the textPaint * @return the string height */ public static float getDesiredHeight(TextPaint paint) { FontMetrics fm = paint.getFontMetrics(); return (float)Math.ceil(fm.descent - fm.ascent); } /** * 解析成行. * @param text the text * @param maxWPix the max w pix * @param paint the paint * @return the draw row count */ public static List<String> getDrawRowStr(String text,int maxWPix,TextPaint paint) { String [] texts = null; if(text.indexOf("\n")!=-1){ texts = text.split("\n"); }else{ texts = new String [1]; texts[0] = text; } //共多少行 List<String> mStrList = new ArrayList<String>(); for(int i=0;i<texts.length;i++){ String textLine = texts[i]; //计算这个文本显示为几行 while(true){ //可容纳的最后一个字的位置 int endIndex = subStringLength(textLine,maxWPix,paint); if(endIndex<=0){ mStrList.add(textLine); }else{ if(endIndex == textLine.length()-1){ mStrList.add(textLine); }else{ mStrList.add(textLine.substring(0,endIndex+1)); } } //获取剩下的 if(textLine.length()>endIndex+1){ //还有剩下的 textLine = textLine.substring(endIndex+1); }else{ break; } } } return mStrList; } /** * * 描述:获取这段文本多少行. * @param text * @param textSize * @param maxWPix * @return */ public static int getDrawRowCount(String text,int maxWPix,TextPaint paint) { String [] texts = null; if(text.indexOf("\n")!=-1){ texts = text.split("\n"); }else{ texts = new String [1]; texts[0] = text; } //共多少行 List<String> mStrList = new ArrayList<String>(); for(int i=0;i<texts.length;i++){ String textLine = texts[i]; //计算这个文本显示为几行 while(true){ //可容纳的最后一个字的位置 int endIndex = subStringLength(textLine,maxWPix,paint); if(endIndex<=0){ mStrList.add(textLine); }else{ if(endIndex == textLine.length()-1){ mStrList.add(textLine); }else{ mStrList.add(textLine.substring(0,endIndex+1)); } } //获取剩下的 if(textLine.length()>endIndex+1){ //还有剩下的 textLine = textLine.substring(endIndex+1); }else{ break; } } } return mStrList.size(); } /** * 描述:绘制文本,支持换行. * * @param canvas the canvas * @param text the text * @param maxWPix the max w pix * @param paint the paint * @param left the left * @param top the top * @return the int */ public static int drawText(Canvas canvas,String text,int maxWPix,TextPaint paint,int left,int top) { if(AbStrUtil.isEmpty(text)){ return 1; } //需要根据文字长度控制换行 //测量文字的长度 List<String> mStrList = getDrawRowStr(text,maxWPix,paint); int hSize = (int)getDesiredHeight(paint); for(int i=0;i<mStrList.size();i++){ //计算坐标 int x = left; int y = top+hSize/2+hSize*i; String textLine = mStrList.get(i); canvas.drawText(textLine,x,y, paint); } return mStrList.size(); } }