前言

最近自定义控件,需要绘制文本,用到了获取文本宽高的代码,在此做下记录。

Paint.measureText() 获取文本宽度

   Paint paint = new Paint();paint.setTextSize(textSize);float strWidth = paint.measureText(content);

Paint.getTextBounds() 获取文字所在区域,进而获取文本宽高

Paint paint = new Paint();
Rect rect = new Rect();
paint.getTextBounds(content, 0, content.length(), rect);
int w = rect.width();
int h = rect.height();

Paint.FontMetrics or Paint.FontMetricsInt 获取文本高度

这两个类的属性意义相同,前者单位float后者单位int。
官方文档说明:

属性 说明
ascent The recommended distance above the baseline for singled spaced text
bottom The maximum distance below the baseline for the lowest glyph in the font at a given text size
descent The recommended distance below the baseline for singled spaced text.
leading The recommended additional space to add between lines of text.
top The maximum distance above the baseline for the tallest glyph in the font at a given text size.

ascent :系统建议的,绘制单个字符时,字符应当的最高高度所在线(相对baseline为负值)
bottom:可绘制的最低高度所在线(相对baseline 为正值)
descent:系统建议的,绘制单个字符时,字符应当的最低高度所在线(相对baseline 为正值)
leading:行间距,即前一行的descent与下一行的ascent之间的距离
top:可绘制的最高高度所在线(相对baseline为负值)
baseline:为绘制基准线
代码示例子

PaintForMetrics.java

package com.xol.widget;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;/*** Created by wwzhang on 2019/3/4*/
public class PaintForMetrics extends View {private Paint mPaint;private int mTextSize = 120;private int mTopColor = Color.parseColor("#cc3333");private int mAscentColor = Color.parseColor("#003366");private int mBaseLineColor = Color.parseColor("#993333");private int mDescentColor = Color.parseColor("#cccc00");private int mBottomColor = Color.parseColor("#663366");private int mBackColor = Color.parseColor("#888888");private int mTextColor = Color.parseColor("#ffffff");public PaintForMetrics(Context context) {this(context, null);}public PaintForMetrics(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public PaintForMetrics(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}private void init(Context context) {mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setTextSize(mTextSize);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(mBackColor);mPaint.setColor(mTextColor);Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();//设置基准线float baseLine = 150;String testContent = "Aa Bb Ff Gg Jj 张?";//绘制文本canvas.drawText(testContent, 0, baseLine, mPaint);//绘制toplinemPaint.setColor(mTopColor);canvas.drawLine(0, baseLine + fontMetrics.top, getMeasuredWidth(), baseLine + fontMetrics.top, mPaint);//绘制ascentmPaint.setColor(mAscentColor);canvas.drawLine(0, baseLine + fontMetrics.ascent, getMeasuredWidth(), baseLine + fontMetrics.ascent, mPaint);//绘制baseLinemPaint.setColor(mBaseLineColor);canvas.drawLine(0, baseLine, getMeasuredWidth(), baseLine, mPaint);//绘制descentmPaint.setColor(mDescentColor);canvas.drawLine(0, baseLine + fontMetrics.descent,getMeasuredWidth(), baseLine + fontMetrics.descent, mPaint);//绘制bottommPaint.setColor(mBottomColor);canvas.drawLine(0, baseLine + fontMetrics.bottom,getMeasuredWidth(), baseLine + fontMetrics.bottom, mPaint);//绘制中心线float centerY = getMeasuredHeight() / 2;canvas.drawLine(0, centerY,getMeasuredWidth(), centerY, mPaint);//绘制竖子居中文本float centerBaseLine = centerY + (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;canvas.drawText(testContent, 0, centerBaseLine, mPaint);}
}

ActivityForFontMetrics.java

package com.xol.viewpagerfragment;import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;/*** Created by wwzhang on 2019/3/4*/
public class ActivityForFontMetrics extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_for_fontmetrics);}
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.xol.widget.PaintForMetricsandroid:layout_width="match_parent"android:layout_height="300dp"android:layout_gravity="center" /></FrameLayout>

运行结果:

文本单行高度:fontMetrics.bottom-fontMetrics.top。
文本高度 :fontMetric.descent-fontMetrics.ascent。
总结:通过fontMetrics绘制文本,关键点是找到绘制的基准线坐标y值。
view中心线求竖直文本居中baseLine公式:centerY+(fontMetric.bottom-fontMetric.top)/2-fontMetroc.bottom。

Android 测量文字宽高相关推荐

  1. android 测量字体宽高,Android中测量Text的宽度和高度

    @(Android技术文章) 个人博客地址: 斯科特安的时间 Android中,在自定义View中通过Canvas绘制文字时,经常需要测量文字的宽度和高度. Paint.measureText (测量 ...

  2. Android 动态设置宽高

    Android 动态设置宽高 val params: FrameLayout.LayoutParams = view?.layoutParams as FrameLayout.LayoutParams ...

  3. Android Text的宽高

    测量Text宽度和高度的方法 Paint.measureText(测量文本的宽度) Paint paint = new Paint(); paint.setTextSize(size); float ...

  4. android 自定义控件的宽高_巧用Handler获取View控件信息

    众所周知,在Android实际开发中,对于某些复杂多变的情况,控件的位置摆放.大小控制并非是xml类型的layout文件完全可以搞定的.此时,我们通常会使用Java代码来通过动态计算,将指定的控件摆放 ...

  5. Android获取屏幕宽高,状态栏宽高,actionbar宽高,layout宽高,导航栏高度的方法汇总

    看这个博客你可以知道 获取屏幕宽高,状态栏宽高,actionbar宽高,layout宽高,导航栏(虚拟按键栏)高度的方法 目录顺序为 代码测试的机型 状态栏高度 actionbar高度 屏幕高度 导航 ...

  6. Android 获取屏幕宽高的正确姿势

    前言 在开发时,我们经常需要根据屏幕的宽高来进行对view的适配,无论是自定义view还是andorid自带的一些控件,比如说需要占当前屏幕高度的30%,就需要获取到屏幕的宽高,但在获取宽高时我遇到了 ...

  7. Android获取View宽高的常见方式

    背景 有时我们会有基于这样的需求,当Activity创建时,调用View.getWidth.View.getHeight().View.getMeasuredWidth() .View.getgetM ...

  8. android获取屏幕宽高与获取控件宽高

    1.获取屏幕宽高 方法1: int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480px ...

  9. android获取该控件在屏幕,android获取屏幕宽高与获取控件宽高(三种方法)

    1.获取屏幕宽高 方法1: int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480px ...

最新文章

  1. 使用python操作redis及简单应用
  2. c语言二十四点游戏,C语言解24点游戏程序
  3. Android -- 逐帧动画
  4. JavaScript Date 对象
  5. [攻防世界 pwn]——string(内涵peak小知识)
  6. 企业的任何方法均可融入敏捷技术
  7. iOS 根据日期判断星座源代码
  8. html控制按钮里面的文字,有谁可以告诉我web网页制作中通过三个按钮控制页面上的一段文字放? 爱问知识人...
  9. php添加gd库,linux下为php添加GD库(重新编译php)
  10. maven私服的创建和使用
  11. 读懂金融危机必看的十四本书
  12. git命令行常用操作及在linux下push到github项目中遇到的问题
  13. java 图片滑动验证码_java实现图片滑动验证(包含前端代码)
  14. ISO14443 PICC 与 PCD 调制解调方式
  15. 信息储存服务器有没有辐射,服务器存储主机存在辐射吗
  16. 服务器打不QQ显示00001,QQ登陆不了显示00001,什么意思
  17. 从0开始实现一个合成大西瓜
  18. Eclipse 创建JavaWeb工程
  19. 算法学习 区间dp 涂色PAINT
  20. CSS的3d翻滚特效

热门文章

  1. 关键词搜索商品(精准控价)
  2. 一封感动万千男人的离婚书
  3. [人工智能-深度学习-41]:开发环境 - GPU进行训练安装与搭建(Pytroch、TensorFlow、Nvidia CUDA)详细过程
  4. 前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-02
  5. 三星s5支持android5.1,三星S5有几个版本 三星S5各版本型号之间有何区别
  6. 什么是车联网,车联网需要解决哪些问题,未来发展前景怎么样?
  7. 自适应的对话气泡皮肤实现方案
  8. Vue 权限菜单(动态路由)详解
  9. 甲骨文公司高管以超1.38亿美元再次跻身最高薪酬高管之列
  10. ArcGIS插件-太乐地图