canvas drawText 如何居中显示。

网上很多关于将text居中到某个矩形或者bitmap中的例子,但是我觉得很多是错的,特别是一些人希望通过观察然后设置某个偏移量让它尽可能居中,我觉得这是再误人子弟。android连text居中都做不到的话,那它就改退出这个市场了。

废话不多说本人是从一篇文章中得到的启示,作为尊重他人我附上这篇文章,供大家参考。http://www.doc88.com/p-3953907358643.html

当然这篇文章讲的不是很详细,特别是对baseline这个值的求法是对的但是表达形式上我觉得不是很满意,所以做了下修改让人更容易明白。

说先要实现text的垂直居中,要先了解一些概念,那就是canvas.drawText("123", x, y, paint);这里的x,y到底指的是什么?x 代表的意思会根据paint的aline值决定,网上的说法就是。x默认是‘www.jcodecraeer.com’这个字符串的左边在屏幕的位置,如果设置了paint.setTextAlign(Paint.Align.CENTER)
就是,值字符中心的位置。

y 很明显就是指字符串baseline的的位置。那什么事baseline,我们看看一个图。

而字符串可以通过

FontMetrics fontMetrics = textPaint.getFontMetrics();

获取到字体的矩阵,而这个矩阵有相应的四个属性。

FontMetrics.top

FontMetrics.ascent

FontMetrics.descent

FontMetrics.bottom

看到这个图里面有5根线,第一根是是top,第二根是ascent,第三根是baseline,第四根跟第五根重叠在一起是descent,和bottom.

所以从图中看到baseline的位置就是我们要求的y的坐标。而这个坐标是如何求的呢。首先我们要求bottom这根线的坐标的方法是:

float bottomY = baseY + fontMetrics.bottom;

这里我们设,bottomY为bottom这根线的坐标,baseY是我们要求的y坐标,fontmetrics.bottom是相应的字体baseline线到bottom线的差值。

字体的高度float  fontHeight = fontMetrics.bottom - fontMetrics.top;

而我们要让这个字符串居中在一个高度为height的矩形里。那这个字符串的底的坐标应该是 1/2 * height + 1/2 * fontHeight = bottomY.

所以根据之前的公式baseY = 1/2
* height + 1/2 * fontHeight - fontmetrics.bottom.

这就是你要cavans.drawText()里的y的坐标。去试一试吧。

时间: 2024-10-07 06:15:03

canvas drawText 如何居中显示。的相关文章

android canvas drawText()文字居中

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

canvas.drawText(text, 0, 0, paint)不显示结果

canvas.drawText(text, 0, 0, paint);屏幕上没有显示我的text内容,原因是 drawText(String text, float x, float y, Paint paint) x为左上坐标,y为右下坐标,如果都置为0 0,明显没结果咯. 如果想正确显示文字信息,应该如何做呢: Rect rect = new Rect(); paint.getTextBounds(text, 0, text.length(), rect); canvas.drawText(

Canvas drawText实现中英文居中

@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); // Measure a text Rect textBounds = new Rect(); mTextPaint.getTextBounds(String.valueOf(mLetter), 0, 1, textBounds); float tex

android中canvas.drawText参数的介绍以及绘制一个文本居中的案例

float baseline = height/2 + mPaint.getTextSize()/2 - mPaint.getFontMetrics().descent;文字尺寸就是 protected void onDraw(Canvas canvas) { String testString = "测试:gafaeh:1234"; Paint mPaint = new Paint(); mPaint.setStrokeWidth(3); mPaint.setTextSize(40)

绘制文字时如何让文字居中显示

理解:x:要绘制文本的x坐标,y:baseline 1.首先调整字符的坐标系为中心, paintUnselectWeekText.setTextAlign(Paint.Align.CENTER); 2.将字符的中心与要绘制的地方的中心对其,那么文字就居中了 canvas.drawText("the text", widthToPlace /2, getPaddingTop() + textHeight, paint)

android学习16#--学习canvas.drawText

本来这篇文章是要写写我在设计高级跑马灯程序的心得的,但是编写过程中花了近一天多的时间搞明白canvas.drawText中的第三个参数[float y]代表的真实含义.学习本文应该能帮助大家掌握FontMetrics类和Rect类成员变量值具体含义. drawText引出问题 先来看看api中是如何定义drawText的参数. /** * Draw the text, with origin at (x,y), using the specified paint. The * origin is

让TextView的drawableLeft与文本一起居中显示

 TextView的drawableLeft.drawableRight和drawableTop是一个常用.好用的属性,可以在文本的上下左右放置一个图片,而不使用更加复杂布局就能达到,我也常常喜欢用RadioButton的这几个属性实现很多效果,但是苦于不支持让drawbleLeft与文本一起居中,设置gravity为center也无济于事,终于有空研究了一下,这里与大家一起分享. 声明 欢迎转载,请注明出处! 博客园:http://www.cnblogs.com/ 农民伯伯: http://w

关于Canvas.drawText中xy位置问题

问: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 Lev

重写TextView,实现圆形背景,文本居中显示

最近,在做考试试题排版,产品提出题号希望显示成圆形背景,序号文本居中显示. (有点问题:文本没有绝对居中,暂时没做处理.) 为此,我采取的方式是重写TextView的onDraw方法,绘制一个圆形背景. 具体代码如下: package com.example.myapp; import android.content.Context; import android.content.res.TypedArray; import android.graphics.*; import android.