关于Android Canvas.drawText方法中的坐标参数的正确解释

canvas.drawText("www.jcodecraeer.com", x, y, paint);  x和y参数是指定字符串中心的坐标吗?还是左上角的坐标?这个问题的直观印象应该是左上角的坐标,但是安卓的处理有点另类,我都怀疑安卓的设计者是不是脑壳有问题了。
x默认是‘www.jcodecraeer.com’这个字符串的左边在屏幕的位置,如果设置了paint.setTextAlign(Paint.Align.CENTER);那就是字符的中心,y是指定这个字符baseline在屏幕上的位置。

API的解释:

public void drawText (String text, float x, float y, Paint paint)
Since: API Level 1 Draw the text, with origin at (x,y), using the specified paint.
The origin is interpreted based on the Align setting in the paint.

起始点的具体位置决定于paint的align设置。
Parameters
text The text to be drawn
x The x-coordinate of the origin of the text being drawn 
y The y-coordinate of the origin of the text being drawn 
paint The paint used for the text (e.g. color, size, style)

Canvas 作为绘制文本时,使用FontMetrics对象,计算位置的坐标。 它的思路和java.awt.FontMetrics的基本相同。 
FontMetrics对象它以四个基本坐标为基准,分别为:

FontMetrics.top
FontMetrics.ascent
FontMetrics.descent
FontMetrics.bottom

Paint textPaint = new Paint( Paint.ANTI_ALIAS_FLAG);

textPaint.setTextSize( 35);

textPaint.setColor( Color.WHITE);

// FontMetrics对象

FontMetrics fontMetrics = textPaint.getFontMetrics();

String text = "abcdefghijklmnopqrstu";

// 计算每一个坐标

float baseX = 0;

float baseY = 100;

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, textPaint);

// BaseLine描画

Paint baseLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);>

baseLinePaint.setColor( Color.RED);

canvas.drawLine(0, baseY, getWidth(), baseY, baseLinePaint);

// Base描画

canvas.drawCircle( baseX, baseY, 5, baseLinePaint);

// TopLine描画

Paint topLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);

topLinePaint.setColor( Color.LTGRAY);

canvas.drawLine(0, topY, getWidth(), topY, topLinePaint);

// AscentLine描画

Paint ascentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);

ascentLinePaint.setColor( Color.GREEN);

canvas.drawLine(0, ascentY, getWidth(), ascentY, ascentLinePaint);

// DescentLine描画

Paint descentLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);

descentLinePaint.setColor( Color.YELLOW);

canvas.drawLine(0, descentY, getWidth(), descentY, descentLinePaint);

// ButtomLine描画

Paint bottomLinePaint = new Paint( Paint.ANTI_ALIAS_FLAG);

bottomLinePaint.setColor( Color.MAGENTA);

canvas.drawLine(0, bottomY, getWidth(), bottomY, bottomLinePaint);

drawText画字符串是baseline对齐的。所以要特别注意这点,不然画文字可能画到其它地方而误以为没有画出来。

如果baseline对齐的话:底端的Y坐标是:(行高-字体高度)/2+字体高度 ,但是字符串并不居中,经过测试如果:(行高-字体高度)/2+字体高度-6 ,就稍微居中了一点。 以上的方法只是一个取巧的做法,网上也没有找到设置文字居中的方法。

按上面办法会有误差。加上那段距离应该就行了:


1

2

3

4

5

FontMetrics
fontMetrics = mPaint.getFontMetrics();

float
fontTotalHeight = fontMetrics.bottom - fontMetrics.top;

float
offY = fontTotalHeight / 2 - fontMetrics.bottom;

float
newY = baseY + offY;

canvas.drawText(text,
baseX, newY, paint);

时间: 2024-08-02 22:10:19

关于Android Canvas.drawText方法中的坐标参数的正确解释的相关文章

Android Canvas.drawText方法中的坐标参数的正确解释

摘要 canvas.drawText(www.jcodecraeer.com, x, y, paint); x和y参数是指定字符串中心的坐标吗?还是左上角的坐标?这个问题的直观印象应该是左上角的坐标,但是安卓的处理有点另类,我都怀疑安卓的设计者是不是脑壳有问题了. x默认是‘www.jcodecraeer.com’这 canvas.drawText("www.jcodecraeer.com", x, y, paint);  x和y参数是指定字符串中心的坐标吗?还是左上角的坐标?这个问题

android canvas drawText()文字居中

近期也是在学习自己定义控件,曾经仅仅自己随便玩了下,一直认为比較难,正好如今工作轻松,每天闲着就看看书看看帖子学习自己定义控件,你还别说自己定义控件学起来还是蛮有趣的!! 这里也跟大家分享下我关于drawText()文字居中的方法. 先附上drawText()的方法说明 说实话当时看了这个,我也没明确这个x,y坐标究竟表达的啥意思,还一直以为是绘制文字中心的坐标,后来发现这个理解是错误的 要想理解这个首先看张图 像图上这样安卓的文字绘制是相对于基线绘制的,也就是图中的红线,而top+bottom

iOS 处理方法中的可变参数

## iOS 处理方法中的可变参数 最近写了一个自定义的对话框的demo,想模仿系统的UIAlertView的实现方式,对处理可变参数的时候,遇到了小问题,于是谷歌了一下,写下了处理问题的方法,记录下来,以备后需. 代码实现 - (instancetype)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelBut

关于java方法中Object... args参数的含义

关于java方法中Object... args参数的含义 在阅读google发布的volley源码时,突然看到一个方法中存在这样的写法,如 :v(String format, Object... args) 不明白什么意思,琢磨着为什么要这样写呢,跟Object[] args是一个意思吗?为什么用三个点代替呢?后来查阅了下文档,原来这是JDK1.5新增语法,新特性,动态参数或者是可变参数的意思. 举例: 有个方法v,调用v方法 v(里面写多少参数都行); 比如: v(1,"s"); v

Android Canvas drawText实现中文垂直居中

public void onDraw (Canvas canvas) { Rect targetRect = new Rect(50, 50, 1000, 200); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setStrokeWidth(3); paint.setTextSize(80); String testString = "Text:中文asdfghjkl"; paint.setColor(Color.CYAN

4、处理方法中获取请求参数、请求头、Cookie及原生的servlet API等

1.请求参数和请求头 使用@RequestParam绑定请求参数,在处理方法的入参处使用该注解可以把请求参数传递给请求方法 —— value :参数名 —— required : 是否必须,默认为true,表示请求参数中必须包含对应的参数,如果不存在,则抛出异常     例如: @RequestMapping(value="/param") public String testParam(@RequestParam(value="name", required=tr

C#方法中的各类参数

居家隔离的第26天,还在持续的疫情着实让人担忧,看着每天新增的确认人数数字,也在为那些家庭祝福,每当想想那不是一个数字是一条条鲜活的生命时就格外沉重.利用闲在家里的时间巩固C#语言的一个难点.最近在温习刘铁锰老师教学视频<C#语言入门详解>加上翻看其他的电子图书巩固自己对一些难点知识的印象,好记性不如烂笔头,组织语言记录下来效果更佳.各种方法通过不同的逻辑和顺序组合在一起就形成了程序,常规都是带有参数的方法,参数可以分为以下几类: 传值参数 引用参数 输出参数 数组参数 可选参数 具名参数 扩

32.C#--方法中使用out参数做登录判断

static void Main(string[] args){//分别提示用户输入用户名和密码//写一个方法来判断用户输入的是否正确//返回给用户一个登陆结果,并且还要单独的返回给用户一个登陆信息//如果用户密或码错误,除了返回登陆结果之外,还要返回一个 "用户名错误"或"密码错误"//如果用户密码都错误则返回"未知错误"Console.WriteLine("请输入用户名"); string name = Console.R

android 在onCreate方法中获得view的宽高

view在绘制完成后才会有自己的宽高,所以在onCreate中要获得view的宽高可以通过以下4中方法: 1.ViewTreeObserver:监听界面绘制事件,在layout时调用,使用完毕后记得removeListener 2.view.post,因为runnable对象会在view的measure.layout后触发 3.重写onLayout方法 4.使用getMeasuredWidth.getMeasuredHeight获得测量后的宽高,可能跟view的真实宽高有差距