package com.martin.simpledevelop.utils.image;
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;
import com.martin.simpledevelop.utils.log.SaLogUtils;
import com.martin.simpledevelop.utils.string.SaStrUtils;
/**
* @Description 图形处理类.包含图片解析算法
* @File SaGraphicUtils.java
* @Package com.martin.simpledevelop.utils.image
* @Date 2015年6月26日上午1:21:23
* @Author Donghongyu 1358506549@qq.com
* @Version v1.0.0
*/
public class SaGraphicUtils {
/**
* Log 输出标签
*/
public static String TAG = SaGraphicUtils.class.getName();
/**
* 描述:获取字符的所在位置(按像素获取最大能容纳的).
*
* @param str
* 指定的字符串
* @param maxPix
* 要取到的位置(像素)
* @param paint
* the paint
* @return 字符的所在位置
*/
public static int subStringLength(String str, int maxPix, TextPaint paint) {
if (SaStrUtils.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;
}
SaLogUtils.d(TAG, "获取字符的所在位置(按像素获取最大能容纳的)>>>" + currentIndex);
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);
SaLogUtils.i(TAG, "获取文字的像素宽>>>" + strWidth);
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);
SaLogUtils.d(TAG, "获得文字的宽度>>>" + strWidth);
return strWidth;
}
/**
* 获取文字的高度
*
* @param paint
* the textPaint
* @return the string height
*/
public static float getDesiredHeight(TextPaint paint) {
FontMetrics fm = paint.getFontMetrics();
float txtHeight = (float) Math.ceil(fm.descent - fm.ascent);
SaLogUtils.d(TAG, "获取文字的高度>>>" + txtHeight);
return txtHeight;
}
/**
* 解析成行.
*
* @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;
}
}
}
SaLogUtils.d(TAG, "解析成行.>>>" + mStrList);
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;
}
}
}
SaLogUtils.d(TAG, "获取这段文本多少行..>>>" + mStrList.size());
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 (SaStrUtils.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);
}
SaLogUtils.d(TAG, "绘制文本,支持换行..>>>" + mStrList.size());
return mStrList.size();
}
}