文字的绘制

157 阅读1分钟

左对齐

竖向居中

// 在圆圈里居中绘制文字
paint.setTextSize(300);
// ★ 如果要得到正确的FontMetrics,要在setTextSize后获取,不然得到的是旧的值
paint.getFontMetrics(fontMetrics);

paint.setTextAlign(Paint.Align.CENTER);
paint.setStrokeWidth(3);
paint.setStyle(Paint.Style.FILL);
// 得到偏移量
float offset = (fontMetrics.ascent + fontMetrics.descent) / 2;
//        float offset = (paint.ascent() + paint.descent()) / 2;// ascent的值也可以直接通过paint得到

canvas.drawText(str, getWidth() / 2, getHeight() / 2 - offset, paint);

其他

  1. StaticLayout 自动换行 (drawText不会自动换行的)
  2. paint.breakText()计算换行的索引,做出文字环绕图片效果

全部代码为

package lemon.view.com.lemonphotoview.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import lemon.view.com.lemonphotoview.view.utils.DpPxUtil;

/**
 * 描述当前版本功能
 *
 */
public class WenZiView extends View {

    private Paint.FontMetrics fontMetrics;
    private Rect rect;

    public WenZiView(Context context) {
        super(context);
    }

    public WenZiView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private Paint paint;
    private int randius = DpPxUtil.dip2px(getContext(), 100);
    String str = "ajf";

    {


        paint = new Paint(Paint.ANTI_ALIAS_FLAG);


        fontMetrics = new Paint.FontMetrics();


        rect = new Rect();

    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 画一个圆圈
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(9);
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, randius, paint);

        // 在圆圈里居中绘制文字
        paint.setTextSize(300);
        // ★ 如果要得到正确的FontMetrics,要在setTextSize后获取,不然得到的是旧的值
        paint.getFontMetrics(fontMetrics);

        paint.setTextAlign(Paint.Align.CENTER);
        paint.setStrokeWidth(3);
        paint.setStyle(Paint.Style.FILL);
        // 得到偏移量
        float offset = (fontMetrics.ascent + fontMetrics.descent) / 2;
//        float offset = (paint.ascent() + paint.descent()) / 2;// ascent的值也可以直接通过paint得到

        canvas.drawText(str, getWidth() / 2, getHeight() / 2 - offset, paint);

        canvas.drawLine(0, getHeight() / 2, 3000, getHeight() / 2, paint);

//++++++++++++++++++++++++++//++++++++++++++++++++++++++//++++++++++++++++++++++++++//++++++++++++++++++++++++++++++

//      左对齐,由于不同字体预留左侧边距不用,所以要去掉
//        大字体
        paint.setTextSize(189);
        paint.getTextBounds(str, 0, str.length(), rect);
        paint.setTextAlign(Paint.Align.LEFT);
        canvas.drawText(str,  - rect.left,200, paint);
//      小字体
        paint.setTextSize(100);
        paint.getTextBounds(str, 0, str.length(), rect);
        paint.setTextAlign(Paint.Align.LEFT);
        canvas.drawText(str,  - rect.left,300, paint);


    }
}