自定义View - baseLine和FontMetrics

我们在自定义TextView时的onDraw()方法是这样写的:

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
        int dy = 0;
        dy = (fontMetricsInt.bottom - fontMetricsInt.top)/2 - fontMetricsInt.bottom;
        int baseLine = getHeight()/2 + dy;
        canvas.drawText(mText,0,baseLine,mPaint);
    }

首先我们来看一下这个方法:drawText(String text, float x, float y, Paint paint)

那么问题来了,我们该如何计算y的值呢?

下面我们来看一张图:

ascent = ascent线的y坐标 - baseline线的y坐标;//负数

descent = descent线的y坐标 - baseline线的y坐标;//正数

top = top线的y坐标 - baseline线的y坐标;//负数

bottom = bottom线的y坐标 - baseline线的y坐标;//正数

leading = top线的y坐标 - ascent线的y坐标;//负数

上面是FontMetrics的各个属性和纵坐标点的数值关系。

我们假设top的y坐标为y0,ascent的y坐标为y1,baseLine的y坐标为y2,descent的y坐标为y3,bottom的y坐标为y4。

getHeight()/2 = y4 - y0;

Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();

y4 = y2 + fontMetricsInt.bottom;

y0 = y2 + fontMetricsInt.top;

getHeight()/2 = (fontMetricsInt.bottom - fontMetricsInt.top)/2;

dy = getHeight()/2 - (y4 - y2);

又y4 - y2 = fontMetricsInt.bottom;

所以dy = (fontMetricsInt.bottom - fontMetricsInt.top)/2 - fontMetricsInt.bottom。

搞清楚基线的计算问题,drawText这个方法的核心难点就解决了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AD钙奶-lalala

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值