Android文本的测量和绘制

翻译与Chris Banes的博客   原文地址

如果你想手动在Android Canvas上画些什么东西,你最好从绘制文本开始。

文本绘制之前,你需要知道测量文本的绘制位置,计算文本X/Y轴的位置。

                                                                                       

最近我在一款APP中,需要在横向和纵向的画布上绘制一些以文本为中心的文字。于是我用了下面这些代码:

Paint mTextPaint = new Paint();
mTextPaint.setTextAlign(Paint.Align.CENTER); // Center the text

// Later when you draw...
canvas.drawText(mText, // Text to display
        mBounds.centerX(), // Center X of canvas bounds
        mBounds.centerY(), // Center Y of canvas bounds
        mTextPaint
);

我没想到代码的运行后竟然是下面的这个样子:

测量文本

接下来,我尝试定位文本,计算了文本的高宽度,并且修改了绘制文本X轴Y轴的位置:

int mTextWidth, mTextHeight; // Our calculated text bounds
Paint mTextPaint = new Paint();

// Now lets calculate the size of the text
Rect textBounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), textBounds);
mTextWidth = textBounds.width();
mTextHeight = textBounds.height();

// Later when you draw...
canvas.drawText(mText, // Text to display
        mBounds.centerX() - (mTextWidth / 2f),
        mBounds.centerY() + (mTextHeight / 2f),
        mTextPaint
);

这一次我们做的已经相当接近了,但是你可以看到文本还是没有居中。

为了确定我没看到的原因,我用Paint.getTextBounds()计算一个矩形,并画在了文本的后面。

正如你看到的,文本的高宽绘制在了计算范围之外。

另一中测量文本的方法

在这个基础点上,我看到Paint另一种计算文本宽度的方法:Paint.measureText()

这个方法只能计算宽度而不能计算高度,因此我尝试结合两种方法:

int mTextWidth, mTextHeight; // Our calculated text bounds
Paint mTextPaint = new Paint();

// Now lets calculate the size of the text
Rect textBounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), textBounds);
mTextWidth = mTextPaint.measureText(mText); // Use measureText to calculate width
mTextHeight = textBounds.height(); // Use height from getTextBounds()

// Later when you draw...
canvas.drawText(mText, // Text to display
        mBounds.centerX() - (mTextWidth / 2f),
        mBounds.centerY() + (mTextHeight / 2f),
        mTextPaint
);

这几下就做出了完美居中的文本。悠嘻!

Android文本的测量和绘制

时间: 2025-01-06 01:59:20

Android文本的测量和绘制的相关文章

Android view的测量及绘制

讲真,自我感觉,我的水平真的是渣的一匹,好多东西都只停留在知道和会用的阶段,也想去研究原理和底层的实现,可是一看到代码就懵逼了,然后就看不下去了, 说自己不着急都是骗人的,我自己都不信,前两天买了本<Android 群英传>,江湖上都说这是一本初级过渡到中级不错的进阶书,所以准备看一下,才看了两天,今天 看到了view的测量及绘制,还有自定义view(还没看完),学到什么就写篇博客吧,算是对自己所学的一个总结和记录吧,也可以督促自己,如果有讲的不对的地方或者 有歧义的地方,欢迎大家吐槽批评我!

android View的测量和绘制

本篇内容来源于android 群英传(徐易生著) 我写到这里,是觉得徐易生讲的确实很好, 另外加入了一些自己的理解,便于自己基础的提高. 如果要绘制一个View , 就需要先取测量它,也就是需要知道它的大小和位置. 这样我们就能在屏幕中滑出来它了.这个过程是在onMeasure()方法中完成的. 一.测量模式 测量view的大小时,需要用到MeasureSpec (测量规范)这个类来指定测量模式 ,一共有3种 EXACTLY (精确模式) , 系统默认值. 如果我们指定控件宽高为 xxdp, x

android openGL ES2 一切从绘制纹理开始

纹理,在openGL中,可以理解为加载到显卡显存中的图片.Android设备在2.2开始支持openGL ES2.0,从前都是ES1.0 和 ES1.1的版本.简单来说,openGL ES是为了嵌入设备进行功能剪裁后的openGL版本.ES2.0是和1.x版本不兼容的,区别和兼容性参见android 官方文档. 首先,android使用openGL提供了特殊的view作为基础叫做GLSurfaceView.我们的view需要继承GLSurfaceView.如下简单示例: public class

自定义View_1_关于View,ViewGroup的测量和绘制流程

自定义View(1) ------ 关于View,ViewGroup的测量和绘制流程 在Android当中,自定义控件属于比较高级的知识体系,今天我们就一起研究研究关于自定义View的那点事,看看它到底高深在什么地方.使用自定义View可以实现不同的效果,比原生控件更加的灵活,当然难度也是大大的加大了,但是不要怕,我们一起慢慢学习,看透他,也就那么点事.好了,不废话了进入我们的正题吧! Android自定义控件的意思就是说我们把我们想要绘制的View显示在屏幕上,并且可以使他有某种功能,这就是一

【Android】编写Drawable XML绘制底部带指示条的背景

要实现的就是类似于Actionbar标签的那种效果,底部有一条指示条. 实现代码: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:top="-6dp" android:left="-6d

Android 使用Universal Image Loader绘制带圆角的图片(一)

Android 使用Universal Image Loader绘制带圆角的图片(一) 绘制带圆角的控件难吗?貌似不难.对于一个普通layout或者widget,要绘制圆角,只要把 background设置成下面这样的drawable就行了. <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/and

Android文本输入框(EditText)切换密码的显示与隐藏

package cc.c; import android.app.Activity; import android.os.Bundle; import android.text.Selection; import android.text.Spannable; import android.text.method.HideReturnsTransformationMethod; import android.text.method.PasswordTransformationMethod; im

Android例子源码动态绘制折线、圆柱、饼状图

Android例子源码动态绘制折线.圆柱.饼状图 仿天气类app绘制饼状图.折线图.柱状图的实现效果,效果挺不错,例子没有使用第三方类库,全部都是使用Canvas实现.需要的朋友可以自己下载研究下. 下载地址:http://www.devstore.cn/code/info/999.html 运行截图:   

Android底层开发之字符绘制TextLayoutCache

源:Android底层开发之字符绘制TextLayoutCache