自定义View - 3.基线问题

作者: zsj1225 | 来源:发表于2018-06-09 14:37 被阅读3次

画文字是canvas.drawText(String text, float x, float y, Paint paint) 温馨提示参数y是文字的基线BaseLine.看下图

image.png

上面的top,ascent等,可以通过下面方法求出.

        Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
        fontMetricsInt.top;
        fontMetricsInt.ascent;
        fontMetricsInt.descent;
        fontMetricsInt.bottom;

上面是所有值都是以基线BaseLine为基准计算的.在BaseLine上面的为负值.在BaseLine下面的为正值.

指定左上角的顶点坐标,绘制文本

公式: float baseLineY = Y - top
下面告诉你这公式是如果求得的.


image.png
    @Override
    protected void onDraw(Canvas canvas) {
        Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
        int y = 100;
        mPaint.setColor(Color.GREEN);
        canvas.drawLine(0,y,2000,y,mPaint);
        //指定左上顶点坐标,绘制文本
        int baseLine = y - fontMetricsInt.top;
        mPaint.setColor(Color.RED);
        canvas.drawText(mMyText, 0, baseLine, mPaint);
    }
image.png

指定中间位置,绘制文本

公式: BaseLineY = centerY +(bottom - top)/2 - bottom
推导过程如下:


image.png

效果:

    @Override
    protected void onDraw(Canvas canvas) {
        Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
        int y = 100;
        mPaint.setColor(Color.GREEN);
        canvas.drawLine(0, y, 2000, y, mPaint);
        //指定中间位置,绘制文本
        int baseLine = y + (fontMetricsInt.bottom - fontMetricsInt.top) / 2 - fontMetricsInt.bottom;
        mPaint.setColor(Color.BLUE);
        canvas.drawText(mMyText, 0, baseLine, mPaint);
    }
image.png

相关文章

网友评论

    本文标题:自定义View - 3.基线问题

    本文链接:https://www.haomeiwen.com/subject/dkpteftx.html