Canvas 文字对齐方式

Canvas 文字对齐方式

常用的画文字的方法

public void drawText (String text, float x, float y, Paint paint)

x,y 并不是指定文字的中点位置,并且x,y与文字对齐方式有关(通过setTextAlign()指定,默认为left)

测试


import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;

/**
 * Created by talon on 2021/3/10
 * note: 根据对象绘制图片
 * 参考:https://www.jianshu.com/p/8b97627b21c4
 */
public class DrawBitmapManager4 {

    private final String TAG = "DrawImageManager";

    public static Bitmap createBitmap() {
        // 创建一个画布
        Bitmap bitmap = Bitmap.createBitmap(800, 1000, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawBitmap(bitmap, 0, 0, null);
        // 给画布加个边框
        Rect rect = new Rect(0, 0, canvas.getWidth(), canvas.getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(2);
        canvas.drawRect(rect, paint);

        // 开始测试数据

        // todo 证明: setStrokeWidth这个方法,并不是往canvas内侧填充,而是往外侧增加一半,往内侧增加一半。
//        testStrokeWidth(canvas);
        // todo  证明:文字居中方案
        setTextCenter(canvas); // 居中
        setTextLeft(canvas); // 左对齐
        setTextRight(canvas); // 右对齐
        return bitmap;
    }


    private static void testStrokeWidth(Canvas canvas) {
        // 划粗400px的线,只填充了200px
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(400);

        canvas.drawLine(0, 0, 0, canvas.getHeight(), paint);
        // 划线
        paint.setColor(Color.RED);
        paint.setStrokeWidth(5);
        canvas.drawLine(210, 0, 210, canvas.getHeight(), paint);
    }


    private static void setTextCenter(Canvas canvas) {

        //矩形背景
        Paint bgRect = new Paint();
        bgRect.setStyle(Paint.Style.FILL);
        bgRect.setColor(Color.TRANSPARENT);
        RectF rectF = new RectF(0, 0, canvas.getWidth(), canvas.getHeight());
        canvas.drawRect(rectF, bgRect);

        Paint textPaint = new Paint();
        textPaint.setStyle(Paint.Style.FILL);
        textPaint.setTextSize(100);
        textPaint.setTextAlign(Paint.Align.CENTER);

        String text = "测Zz试";
        //计算baseline ;
        Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
        float distance = (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;
        float baseline = rectF.centerY() + distance;
        canvas.drawText(text, rectF.centerX(), baseline, textPaint);

        // 划线标记中间位置
        textPaint.setColor(Color.RED);
        textPaint.setStrokeWidth(5);
        canvas.drawLine(0, canvas.getHeight() / 2, canvas.getWidth(), canvas.getHeight() / 2, textPaint);
    }

    private static void setTextLeft(Canvas canvas) {

        //矩形背景
        Paint bgRect = new Paint();
        bgRect.setStyle(Paint.Style.FILL);
        bgRect.setColor(Color.TRANSPARENT);
        RectF rectF = new RectF(0, 0, canvas.getWidth(), canvas.getHeight());
        canvas.drawRect(rectF, bgRect);

        Paint textPaint = new Paint();
        textPaint.setStyle(Paint.Style.FILL);
        textPaint.setTextSize(100);
        textPaint.setTextAlign(Paint.Align.LEFT);

        String text = "测Zz试";
        //计算baseline ;
        Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
        float distance = (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;
        float baseline = rectF.centerY() + distance;
        canvas.drawText(text, rectF.left, baseline, textPaint);

        // 划线标记中间位置
        textPaint.setColor(Color.RED);
        textPaint.setStrokeWidth(5);
        canvas.drawLine(0, canvas.getHeight() / 2, canvas.getWidth(), canvas.getHeight() / 2, textPaint);
    }


    private static void setTextRight(Canvas canvas) {

        //矩形背景
        Paint bgRect = new Paint();
        bgRect.setStyle(Paint.Style.FILL);
        bgRect.setColor(Color.TRANSPARENT);
        RectF rectF = new RectF(0, 0, canvas.getWidth(), canvas.getHeight());
        canvas.drawRect(rectF, bgRect);

        Paint textPaint = new Paint();
        textPaint.setStyle(Paint.Style.FILL);
        textPaint.setTextSize(100);
        textPaint.setTextAlign(Paint.Align.RIGHT);

        String text = "测Zz试";
        //计算baseline ;
        Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
        float distance = (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;
        float baseline = rectF.centerY() + distance;
        canvas.drawText(text, rectF.right, baseline, textPaint);

        // 划线标记中间位置
        textPaint.setColor(Color.RED);
        textPaint.setStrokeWidth(5);
        canvas.drawLine(0, canvas.getHeight() / 2, canvas.getWidth(), canvas.getHeight() / 2, textPaint);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值