关于Paint文字绘制

42 阅读1分钟

在Canvas中,在使用drawText()时,也是有基准线

image.png

(来自《Android自定义控件开发入门与实战》)

drawText(String text,float x,float y,Paint paint)//这个方法中y就是基线的开始位置,而不是文字开始左上角,x代表文字所在矩形的相对位置。paint.setTextAlign()就是相对于这个x的位置。

文字绘制的四线格

image.png

ascent,descent表示系统推荐的安全区域

Paint.FontMetrics fm = paint.getFontMetrics(); //可以通过这个方法获取这4个值。

当 baseLineY = 0时对应几个参数的打印 image.png

所以这几个参数的值不是对应在画布里的坐标,而是对应baseLine的相对位置,可以使用baseLine的坐标加上这些值来得到具体画布中的位置

绘制的宽和高


    int height = Math.abs(fm.bootom - fm.tob);
    int width = (int)paint.measureText("hello world");
    
    
    //得到的最小矩形
    Rect minRect = new Rect();
    paint.getTextBounds(text,0,text.length(),minRect); //但是,这个地方因为基线时基于0的,所以我们要获得实际绘制的文字的最小rect的坐标,需要平移0到baseLine这段距离,实际顶部和底部:minRect.top + baseLine,minRect.bottom + baseLine;
    

如果我们现在知道要绘制位置的左上角顶点,我们可以通过公式转换一下

FontMetrics.Top = top - baseLine; baseLine = top - FontMetrics.Top;

如果我们知道绘制的中心线的位置(center是绘制矩形的上下中心线)

baseLine = center + (FontMetrics.bottom - FontMetrics.top)/2 - FontMetrics.bottom;