关于Canvas.drawText中xy位置问题
来源:互联网 发布:淘宝评价完了怎么截图 编辑:程序博客网 时间:2024/06/05 07:14
from:http://blog.csdn.net/lvxiangan/article/details/8540774
问:canvas.drawText("3", x, y, paint); x和y是指画得时候数字3中心的坐标吗?还是左上角的坐标?
答:x默认是‘3’这个字符的左边在屏幕的位置,如果设置了paint.setTextAlign(Paint.Align.CENTER);那就是字符的中心,y是指定这个字符baseline在屏幕上的位置。
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.
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 ,就稍微居中了一点。 以上的方法只是一个取巧的做法,网上也没有找到设置文字居中的方法。
按上面办法会有误差。加上那段距离应该就行了:
- 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);
- 关于Canvas.drawText中xy位置问题
- 关于Canvas.drawText中xy位置问题
- 关于Canvas.drawText中xy位置问题
- 关于Canvas.drawText中xy位置问题
- 关于Canvas.drawText中xy位置问题
- Android: 关于Canvas.drawText
- Canvas&Paint[]Paint:drawText位置
- Canvas drawText
- Canvas---drawText()
- canvas.drawText
- Android Canvas DrawText中文乱码问题。
- 【Android学习笔记】canvas drawText居中问题
- 【Android学习笔记】canvas drawText居中问题
- Android canvas中的drawText居中问题
- HTML5中Canvas的drawText对齐细节
- Android 中Canvas.drawText实现文字居中
- Canvas上写字drawText -- 确定字符串居中位置
- XY问题(XY Problem)
- 使用Timer类的动画
- 网页设计心得报告(2) 网站规划 by wrh
- mysql数据库主从配置
- Android:数据存储和界面展示
- win10使用01:安装Sql Server 2008 r2的注意事项
- 关于Canvas.drawText中xy位置问题
- Cocos2D iOS之旅:如何写一个敲地鼠游戏(二):Cocos2D中的高清支持
- virtualbox安装centos出错
- 传统线程互斥技术Synchronized 02
- 快速理解RequireJs
- Android开发:网络编程
- Go 语言条件语句和循环语句
- Android开发之获取手机网络状态及网络是否连接
- Rocksdb源码剖析一----Rocksdb概述与基本组件