解决方案 »

  1.   

    布局文件里  android:gravity="center"
      

  2.   

    直接绘图吧/**
     * 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;
        }
    }
      

  3.   

    怎么重写??    重新定义TextView布局????