Android 测量文字宽高
前言
最近自定义控件,需要绘制文本,用到了获取文本宽高的代码,在此做下记录。
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 测量文字宽高相关推荐
- android 测量字体宽高,Android中测量Text的宽度和高度
@(Android技术文章) 个人博客地址: 斯科特安的时间 Android中,在自定义View中通过Canvas绘制文字时,经常需要测量文字的宽度和高度. Paint.measureText (测量 ...
- Android 动态设置宽高
Android 动态设置宽高 val params: FrameLayout.LayoutParams = view?.layoutParams as FrameLayout.LayoutParams ...
- Android Text的宽高
测量Text宽度和高度的方法 Paint.measureText(测量文本的宽度) Paint paint = new Paint(); paint.setTextSize(size); float ...
- android 自定义控件的宽高_巧用Handler获取View控件信息
众所周知,在Android实际开发中,对于某些复杂多变的情况,控件的位置摆放.大小控制并非是xml类型的layout文件完全可以搞定的.此时,我们通常会使用Java代码来通过动态计算,将指定的控件摆放 ...
- Android获取屏幕宽高,状态栏宽高,actionbar宽高,layout宽高,导航栏高度的方法汇总
看这个博客你可以知道 获取屏幕宽高,状态栏宽高,actionbar宽高,layout宽高,导航栏(虚拟按键栏)高度的方法 目录顺序为 代码测试的机型 状态栏高度 actionbar高度 屏幕高度 导航 ...
- Android 获取屏幕宽高的正确姿势
前言 在开发时,我们经常需要根据屏幕的宽高来进行对view的适配,无论是自定义view还是andorid自带的一些控件,比如说需要占当前屏幕高度的30%,就需要获取到屏幕的宽高,但在获取宽高时我遇到了 ...
- Android获取View宽高的常见方式
背景 有时我们会有基于这样的需求,当Activity创建时,调用View.getWidth.View.getHeight().View.getMeasuredWidth() .View.getgetM ...
- android获取屏幕宽高与获取控件宽高
1.获取屏幕宽高 方法1: int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480px ...
- android获取该控件在屏幕,android获取屏幕宽高与获取控件宽高(三种方法)
1.获取屏幕宽高 方法1: int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480px ...
最新文章
- 使用python操作redis及简单应用
- c语言二十四点游戏,C语言解24点游戏程序
- Android -- 逐帧动画
- JavaScript Date 对象
- [攻防世界 pwn]——string(内涵peak小知识)
- 企业的任何方法均可融入敏捷技术
- iOS 根据日期判断星座源代码
- html控制按钮里面的文字,有谁可以告诉我web网页制作中通过三个按钮控制页面上的一段文字放? 爱问知识人...
- php添加gd库,linux下为php添加GD库(重新编译php)
- maven私服的创建和使用
- 读懂金融危机必看的十四本书
- git命令行常用操作及在linux下push到github项目中遇到的问题
- java 图片滑动验证码_java实现图片滑动验证(包含前端代码)
- ISO14443 PICC 与 PCD 调制解调方式
- 信息储存服务器有没有辐射,服务器存储主机存在辐射吗
- 服务器打不QQ显示00001,QQ登陆不了显示00001,什么意思
- 从0开始实现一个合成大西瓜
- Eclipse 创建JavaWeb工程
- 算法学习 区间dp 涂色PAINT
- CSS的3d翻滚特效
热门文章
- 关键词搜索商品(精准控价)
- 一封感动万千男人的离婚书
- [人工智能-深度学习-41]:开发环境 - GPU进行训练安装与搭建(Pytroch、TensorFlow、Nvidia CUDA)详细过程
- 前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-02
- 三星s5支持android5.1,三星S5有几个版本 三星S5各版本型号之间有何区别
- 什么是车联网,车联网需要解决哪些问题,未来发展前景怎么样?
- 自适应的对话气泡皮肤实现方案
- Vue 权限菜单(动态路由)详解
- 甲骨文公司高管以超1.38亿美元再次跻身最高薪酬高管之列
- ArcGIS插件-太乐地图