直接绘图吧/** * Created by Coder.Yan on 14-7-11. */ public final class CanvasDrawer { public class TextAlign { public final static int TOPLEFT = 0; public final static int TOP = 1; public final static int TOPRIGHT = 2; public final static int LEFT = 3; public final static int CENTER = 4; public final static int RIGHT = 5; public final static int BOTTOMLEFT = 6; public final static int BOTTOM = 7; public final static int BOTTOMRIGHT = 8; } public class FontStyle { public final static int NORMAL = 0; public final static int BLOD = 1; public final static int ITALIC = 2; public final static int UNDERLINE = 4; } public final static float SCALE_MAXIMUM = 5f; public final static float SCALE_MINIMUM = 0.2f; public final static int FONTSTYLE_DEFAULT = 0; public final static int FONTSTYLE_BLOD = 1; private static float canvasScale = 1f; private static float defaultFontSize = 12f; private CanvasDrawer() { } public static float getDefaultFontSize() { return defaultFontSize; } public static void setDefaultFontSize(float defaultFontSize) { CanvasDrawer.defaultFontSize = defaultFontSize; } public static float getCanvasScale() { return canvasScale; } public static float setCanvasScale(float canvasScale) { if (canvasScale < SCALE_MINIMUM) canvasScale = SCALE_MINIMUM; if (canvasScale > SCALE_MAXIMUM) canvasScale = SCALE_MAXIMUM; CanvasDrawer.canvasScale = canvasScale; return canvasScale; } public final static Rect round(RectF rectF) { return new Rect(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF.bottom)); } /** * 绘制文本 * * @param canvas 画布 * @param text 要绘制的文本 * @param fontSize 字体大小 * @param paint 画笔 * @param textAlign 文本对齐方式 * @param bounds 文本绘制区域 */ public static void drawText(Canvas canvas, String text, float fontSize, Paint paint, int textAlign, RectF bounds) { float scale = getCanvasScale(); setTextAlign(paint, textAlign); paint.setTextSize(fontSize * scale); Paint.FontMetrics metrics = paint.getFontMetrics(); PointF loc = getTextLocal(metrics, bounds, scale, textAlign); canvas.drawText(text, loc.x, loc.y, paint); } /** * 绘制多行文本 * * @param canvas 画布 * @param lines 绘制的文本 * @param fontSize 字体大小 * @param paint 画笔 * @param textAlign 文本的对其方式 * @param bounds 文本区域 * @param lineSpan 行距 */ public static void drawTexts(Canvas canvas, String[] lines, float fontSize, Paint paint, int textAlign, RectF bounds, float lineSpan) { canvas.save(); float scale = getCanvasScale(); setTextAlign(paint, textAlign); paint.setTextSize(fontSize * scale); Paint.FontMetrics metrics = paint.getFontMetrics(); canvas.clipRect(scale(bounds, scale)); //设置裁剪区域 float fontHeight = metrics.bottom - metrics.top; float lineHeight = fontHeight / scale + lineSpan; //行高 float top = bounds.top; switch (textAlign) { case TextAlign.LEFT: case TextAlign.CENTER: case TextAlign.RIGHT: top = bounds.top + (bounds.height() - lineHeight * lines.length) / 2 + lineSpan / 2; break; case TextAlign.BOTTOMLEFT: case TextAlign.BOTTOM: case TextAlign.TOPRIGHT: top = bounds.bottom - lineHeight * lines.length - lineSpan; break; } for (String text : lines) { RectF textBounds = new RectF(bounds.left, top, bounds.right, top + lineHeight); PointF loc = getTextLocal(metrics, textBounds, scale, textAlign); canvas.drawText(text, loc.x, loc.y, paint); top += lineHeight; } canvas.restore(); } private static PointF getTextLocal(Paint.FontMetrics metrics, RectF bounds, float scale, int textAlign) { float fontHeight = metrics.bottom - metrics.top; float x = bounds.left * scale; float y = bounds.top * scale - metrics.top; switch (textAlign) { case TextAlign.CENTER: case TextAlign.TOP: case TextAlign.BOTTOM: x = bounds.centerX() * scale; break; case TextAlign.RIGHT: case TextAlign.TOPRIGHT: case TextAlign.BOTTOMRIGHT: x = bounds.right * scale; break; } switch (textAlign) { case TextAlign.LEFT: case TextAlign.RIGHT: case TextAlign.CENTER: y = (bounds.centerY()) * scale - fontHeight / 2 - metrics.top; break; case TextAlign.BOTTOM: case TextAlign.BOTTOMLEFT: case TextAlign.BOTTOMRIGHT: y = (bounds.bottom) * scale - metrics.bottom; } return new PointF(x, y); } public static void setTextAlign(Paint paint, int align) { switch (align) { case TextAlign.TOP: case TextAlign.CENTER: case TextAlign.BOTTOM: paint.setTextAlign(Paint.Align.CENTER); break; case TextAlign.LEFT: case TextAlign.BOTTOMLEFT: case TextAlign.TOPLEFT: paint.setTextAlign(Paint.Align.LEFT); break; case TextAlign.RIGHT: case TextAlign.BOTTOMRIGHT: case TextAlign.TOPRIGHT: paint.setTextAlign(Paint.Align.RIGHT); break; } } public static void setTextFontStyle(Paint paint, int fontStyle) { paint.setTextSkewX(isFontItalic(fontStyle) ? 0.5f : 0); paint.setFakeBoldText(isFontBlod(fontStyle)); paint.setUnderlineText(isFontUnderLine(fontStyle)); } public static boolean isFontBlod(int style) { return (style & FontStyle.BLOD) != 0; } public static boolean isFontItalic(int style) { return (style & FontStyle.ITALIC) != 0; } public static boolean isFontUnderLine(int style) { return (style & FontStyle.UNDERLINE) != 0; } public static boolean isFontNormal(int style) { return style == 0; } }
* Created by Coder.Yan on 14-7-11.
*/
public final class CanvasDrawer { public class TextAlign {
public final static int TOPLEFT = 0;
public final static int TOP = 1;
public final static int TOPRIGHT = 2;
public final static int LEFT = 3;
public final static int CENTER = 4;
public final static int RIGHT = 5;
public final static int BOTTOMLEFT = 6;
public final static int BOTTOM = 7;
public final static int BOTTOMRIGHT = 8;
} public class FontStyle {
public final static int NORMAL = 0;
public final static int BLOD = 1;
public final static int ITALIC = 2;
public final static int UNDERLINE = 4;
} public final static float SCALE_MAXIMUM = 5f;
public final static float SCALE_MINIMUM = 0.2f; public final static int FONTSTYLE_DEFAULT = 0;
public final static int FONTSTYLE_BLOD = 1;
private static float canvasScale = 1f; private static float defaultFontSize = 12f; private CanvasDrawer() {
} public static float getDefaultFontSize() {
return defaultFontSize;
} public static void setDefaultFontSize(float defaultFontSize) {
CanvasDrawer.defaultFontSize = defaultFontSize;
} public static float getCanvasScale() {
return canvasScale;
} public static float setCanvasScale(float canvasScale) {
if (canvasScale < SCALE_MINIMUM)
canvasScale = SCALE_MINIMUM;
if (canvasScale > SCALE_MAXIMUM)
canvasScale = SCALE_MAXIMUM;
CanvasDrawer.canvasScale = canvasScale;
return canvasScale;
} public final static Rect round(RectF rectF) {
return new Rect(Math.round(rectF.left),
Math.round(rectF.top),
Math.round(rectF.right),
Math.round(rectF.bottom));
} /**
* 绘制文本
*
* @param canvas 画布
* @param text 要绘制的文本
* @param fontSize 字体大小
* @param paint 画笔
* @param textAlign 文本对齐方式
* @param bounds 文本绘制区域
*/
public static void drawText(Canvas canvas, String text, float fontSize, Paint paint, int textAlign, RectF bounds) {
float scale = getCanvasScale();
setTextAlign(paint, textAlign);
paint.setTextSize(fontSize * scale);
Paint.FontMetrics metrics = paint.getFontMetrics();
PointF loc = getTextLocal(metrics, bounds, scale, textAlign);
canvas.drawText(text, loc.x, loc.y, paint);
} /**
* 绘制多行文本
*
* @param canvas 画布
* @param lines 绘制的文本
* @param fontSize 字体大小
* @param paint 画笔
* @param textAlign 文本的对其方式
* @param bounds 文本区域
* @param lineSpan 行距
*/
public static void drawTexts(Canvas canvas, String[] lines, float fontSize, Paint paint, int textAlign, RectF bounds, float lineSpan) {
canvas.save();
float scale = getCanvasScale();
setTextAlign(paint, textAlign);
paint.setTextSize(fontSize * scale);
Paint.FontMetrics metrics = paint.getFontMetrics();
canvas.clipRect(scale(bounds, scale)); //设置裁剪区域
float fontHeight = metrics.bottom - metrics.top;
float lineHeight = fontHeight / scale + lineSpan; //行高
float top = bounds.top;
switch (textAlign) {
case TextAlign.LEFT:
case TextAlign.CENTER:
case TextAlign.RIGHT:
top = bounds.top + (bounds.height() - lineHeight * lines.length) / 2 + lineSpan / 2;
break;
case TextAlign.BOTTOMLEFT:
case TextAlign.BOTTOM:
case TextAlign.TOPRIGHT:
top = bounds.bottom - lineHeight * lines.length - lineSpan;
break;
}
for (String text : lines) {
RectF textBounds = new RectF(bounds.left, top, bounds.right, top + lineHeight);
PointF loc = getTextLocal(metrics, textBounds, scale, textAlign);
canvas.drawText(text, loc.x, loc.y, paint);
top += lineHeight;
} canvas.restore();
} private static PointF getTextLocal(Paint.FontMetrics metrics, RectF bounds, float scale, int textAlign) {
float fontHeight = metrics.bottom - metrics.top;
float x = bounds.left * scale;
float y = bounds.top * scale - metrics.top;
switch (textAlign) {
case TextAlign.CENTER:
case TextAlign.TOP:
case TextAlign.BOTTOM:
x = bounds.centerX() * scale;
break;
case TextAlign.RIGHT:
case TextAlign.TOPRIGHT:
case TextAlign.BOTTOMRIGHT:
x = bounds.right * scale;
break;
}
switch (textAlign) {
case TextAlign.LEFT:
case TextAlign.RIGHT:
case TextAlign.CENTER:
y = (bounds.centerY()) * scale - fontHeight / 2 - metrics.top;
break;
case TextAlign.BOTTOM:
case TextAlign.BOTTOMLEFT:
case TextAlign.BOTTOMRIGHT:
y = (bounds.bottom) * scale - metrics.bottom;
}
return new PointF(x, y);
} public static void setTextAlign(Paint paint, int align) {
switch (align) {
case TextAlign.TOP:
case TextAlign.CENTER:
case TextAlign.BOTTOM:
paint.setTextAlign(Paint.Align.CENTER);
break;
case TextAlign.LEFT:
case TextAlign.BOTTOMLEFT:
case TextAlign.TOPLEFT:
paint.setTextAlign(Paint.Align.LEFT);
break;
case TextAlign.RIGHT:
case TextAlign.BOTTOMRIGHT:
case TextAlign.TOPRIGHT:
paint.setTextAlign(Paint.Align.RIGHT);
break;
}
} public static void setTextFontStyle(Paint paint, int fontStyle) {
paint.setTextSkewX(isFontItalic(fontStyle) ? 0.5f : 0);
paint.setFakeBoldText(isFontBlod(fontStyle));
paint.setUnderlineText(isFontUnderLine(fontStyle));
} public static boolean isFontBlod(int style) {
return (style & FontStyle.BLOD) != 0;
} public static boolean isFontItalic(int style) {
return (style & FontStyle.ITALIC) != 0;
} public static boolean isFontUnderLine(int style) {
return (style & FontStyle.UNDERLINE) != 0;
} public static boolean isFontNormal(int style) {
return style == 0;
}
}