Android使用FontMetrics对象计算位置坐标

作者:teletian 时间:2023-02-06 15:35:20 

Canvas绘制文本时,使用FontMetrics对象,计算位置的坐标。


public static class FontMetrics {
 /**
  * The maximum distance above the baseline for the tallest glyph in
  * the font at a given text size.
  */
 public float  top;
 /**
  * The recommended distance above the baseline for singled spaced text.
  */
 public float  ascent;
 /**
  * The recommended distance below the baseline for singled spaced text.
  */
 public float  descent;
 /**
  * The maximum distance below the baseline for the lowest glyph in
  * the font at a given text size.
  */
 public float  bottom;
 /**
  * The recommended additional space to add between lines of text.
  */
 public float  leading;
}

它的各基准线可以参考下图:

Android使用FontMetrics对象计算位置坐标

上图其实是通过代码画出来的,具体代码如下:


/** 绘制FontMetrics对象的各种线 */
mPaint.reset();
mPaint.setColor(Color.WHITE);
mPaint.setTextSize(80);
// FontMetrics对象
FontMetrics fontMetrics = mPaint.getFontMetrics();
String text = "abcdefg";
// 计算每一个坐标
float textWidth = mPaint.measureText(text);
float baseX = 30;
float baseY = 700;
float topY = baseY + fontMetrics.top;
float ascentY = baseY + fontMetrics.ascent;
float descentY = baseY + fontMetrics.descent;
float bottomY = baseY + fontMetrics.bottom;
// 绘制文本
canvas.drawText(text, baseX, baseY, mPaint);
// BaseLine描画
mPaint.setColor(Color.RED);
canvas.drawLine(baseX, baseY, baseX + textWidth, baseY, mPaint);
mPaint.setTextSize(20);
canvas.drawText("base", baseX + textWidth, baseY, mPaint);
// Base描画
canvas.drawCircle(baseX, baseY, 5, mPaint);
// TopLine描画
mPaint.setColor(Color.LTGRAY);
canvas.drawLine(baseX, topY, baseX + textWidth, topY, mPaint);
canvas.drawText("top", baseX + textWidth, topY, mPaint);
// AscentLine描画
mPaint.setColor(Color.GREEN);
canvas.drawLine(baseX, ascentY, baseX + textWidth, ascentY, mPaint);
canvas.drawText("ascent", baseX + textWidth, ascentY + 10, mPaint);
// DescentLine描画
mPaint.setColor(Color.YELLOW);
canvas.drawLine(baseX, descentY, baseX + textWidth, descentY, mPaint);
canvas.drawText("descent", baseX + textWidth, descentY, mPaint);
// ButtomLine描画
mPaint.setColor(Color.MAGENTA);
canvas.drawLine(baseX, bottomY, baseX + textWidth, bottomY, mPaint);
canvas.drawText("buttom", baseX + textWidth, bottomY + 10, mPaint);

相信通过以上程序,能够很好的理解topLine,buttomLine,baseLine,ascentLine,descentLine。
另外:Paint类有两个方法


/**
* Return the distance above (negative) the baseline (ascent) based on the
* current typeface and text size.
*
* @return the distance above (negative) the baseline (ascent) based on the
*     current typeface and text size.
*/
public native float ascent();

/**
* Return the distance below (positive) the baseline (descent) based on the
* current typeface and text size.
*
* @return the distance below (positive) the baseline (descent) based on
*     the current typeface and text size.
*/
public native float descent();

ascent():the distance above the baseline(baseline以上的height)
descent():the distance below the baseline(baseline以下的height)

所以ascent() + descent() 可以看成文字的height。

到此为止,怎么获取文字的height和width都已经揭晓了:

获取height : mPaint.ascent() + mPaint.descent()

获取width : mPaint.measureText(text)

来源:https://blog.csdn.net/tianjf0514/article/details/7642656

标签:Android,FontMetrics,位置坐标
0
投稿

猜你喜欢

  • SpringBoot使用validation做参数校验说明

    2022-04-24 09:18:03
  • Java cookie和session会话技术介绍

    2021-12-30 06:51:22
  • Java中ArrayList与顺序表的定义与实现方法

    2022-06-08 03:27:12
  • 理解Android中Activity的方法回调

    2023-06-27 13:35:36
  • Asp.Net中MVC缓存详解

    2023-06-08 13:44:45
  • unity实现贪吃蛇游戏

    2022-05-28 07:07:51
  • Android自定义View实现多边形统计图示例代码

    2021-09-28 13:17:44
  • Maven的生命周期与自定义插件实现方法

    2022-04-06 20:13:48
  • C#实现缩放和剪裁图片的方法示例

    2023-06-03 11:09:31
  • 深入探究Java线程的创建与构造方法

    2023-05-29 22:02:45
  • Android中的Launch Mode详情

    2022-10-06 02:38:09
  • 详解SpringBoot工程的三种搭建方式

    2022-09-20 21:47:23
  • 解析ADT-20问题 android support library

    2023-06-19 22:20:20
  • Spring Cache框架应用介绍

    2023-06-15 22:32:59
  • Java date format时间格式化操作示例

    2021-10-28 19:12:24
  • Android OpenGL仿自如APP裸眼3D效果详解

    2023-12-23 21:37:05
  • 利用unity代码C#封装为dll的步骤分享

    2023-12-02 00:31:00
  • Android实现图片添加阴影效果的2种方法

    2022-10-31 06:46:55
  • C#中#define后面只加一个参数的解释

    2022-09-06 07:23:55
  • C#最简单的关闭子窗体更新父窗体的实现方法

    2021-07-24 18:58:27
  • asp之家 软件编程 m.aspxhome.com