FontMetrics在API中解释如下: Class that describes the various metrics for a font at a given text size.
fontMetrics = FontUtil.getFontMetric(font); int tmpHeight = fontMetrics.getHeight(), tmpW = (font.getSize() + fontMetrics.getDescent() + lineSpace) : -(font.getSize() + fontMetrics.getDescent ), tmpY); // 换行,y坐标递增一位 tmpY += fontMetrics.getHeight() + lineSpace; >>> 1); } } private int calculateY(String text, FontMetrics fontMetrics) { { int size = fontMetrics.stringWidth(text) + fontMetrics.getDescent() * (text.length() -
获取上述除基线外的四个值 : 注意这几个值的加减关系 , 每条线的值减去基线的值 , 有正数 , 有负数 ; FontMetrics fontMetrics = mPaint.getFontMetrics (); //Top - Baseline : top : -12.673828 fontMetrics.top; //Ascent - Baseline : ascent : -11.1328125 fontMetrics.ascent; //Descent - Baseline : descent : 2.9296875 fontMetrics.descent; //Bottom - Baseline : bottom : 3.2519531 fontMetrics.bottom; 4 .
Paint.FontMetrics FontMetrics是文字测量的重要方法,它提供了下面这些变量,来展示文字测量的相关参数: baseline:字符绘制基线 ascent:字符最高点到baseline 通过下面这张图,大家可以非常清楚的了解FontMetrics。 ? ,根据已知变量和fontMetrics的相关参数,来计算baseline的距离,下面就是文本垂直居中的推算过程。 文本的descent:descentY = baselineY + fontMetrics.descent; 文本的字体高度:fontHeight = fontMetrics.descent- fontMetrics.ascent + fontMetrics.descent ) 此时求得baseline的值,即cavans.drawText()里的y的坐标。
textBounds); //文字的x轴起始点 int dx = (getWidth() - textBounds.width()) / 2; // 获取画笔的FontMetrics Paint.FontMetrics fontMetrics = mPaint.getFontMetrics(); // 计算文字的基线 int baseLine = (int) (getHeight() / 2 + (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom);
paint.setColor(mColor); paint.setAntiAlias(true); Paint.FontMetricsInt fontMetrics , x + mSize + strokeWidth + 0.5f - mRightMarginPx, y + fontMetrics.descent); paint.setStyle( paint.setAntiAlias(true); paint.setTextAlign(Paint.Align.CENTER); Paint.FontMetrics fontMetrics = paint.getFontMetrics(); final int textCenterX = (mSize - mRightMarginPx / 2) / 2; int textBaselineY = (int) (y - fontMetrics.descent / 2); final String tag = text.subSequence
textHeight = 0f private var fontDescent = 0f private fun getFontMetrics(textSize: Float) : Paint.FontMetrics { paint.textSize = textSize val fontMetrics = Paint.FontMetrics() paint.getFontMetrics (fontMetrics) return fontMetrics } var textSize = 0f set(value) { field =
(content.charAt(i) + "", x, lastY); lastY += fontMetrics.charWidth(content.charAt(i)) + fontMetrics.getDescent () - 1); // 5 int lineNum = (int) Math.ceil((fontMetrics.stringWidth(str) + l) / (float) lineLen); 根据上面的计算, l=72, lineNum=5; 然后就是一个字符一个字符的进行绘制,每次需要重新计算y坐标 tmpLen = fontMetrics.charWidth(str.charAt(i)) fontMetrics) { // 字体间距所占用的高度 int l = fontMetrics.getDescent() * (str.length() - 1); // 分的行数 (tmp) + fontMetrics.getDescent() * (tmp.length() - 1), options.getAlignStyle()) + fontMetrics.getAscent
(); mLineBaselines.clear(); mLineWidths.clear(); int start = 0; //获取FontMetrics Paint.FontMetrics fontMetrics = mPaint.getFontMetrics(); //第一行文字的中心线 float centerY = fontMetrics.bottom - fontMetrics.top; do { float[] lineWidth = new float[1]; mLineWidths.add(lineWidth[0]); //计算当前行基线坐标 mLineBaselines.add(centerY - (fontMetrics.bottom + fontMetrics.top) / 2f); //下一行的中线坐标 centerY += fontMetrics.bottom - fontMetrics.top
import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Font;import java.awt.FontMetrics fontMetrics = g2d.getFontMetrics(); int textWidth = fontMetrics.stringWidth(text); fontMetrics = g2d.getFontMetrics(); int textWidth = fontMetrics.stringWidth(text); int fontMetrics = g2d.getFontMetrics(); int textWidth = fontMetrics.stringWidth(text); int textHeight = fontMetrics.getHeight(); for (int x = 0; x < sourceImage.getWidth(); x +=
QPaintEvent *event) { QFrame::paintEvent(event); 0 QPainter painter(this); QFontMetrics fontMetrics = painter.fontMetrics(); bool didElide = false; int lineSpacing = fontMetrics.lineSpacing() } else { QString lastLine = content.mid(line.textStart()); QString elidedLastLine = fontMetrics.elidedText (lastLine, Qt::ElideRight, width()); painter.drawText(QPoint(0, y + fontMetrics.ascent()), elidedLastLine
) { paint.setColor(mColor); paint.setAntiAlias(true); Paint.FontMetricsInt fontMetrics , x + mSize + strokeWidth + 0.5f - mRightMarginPx, y + fontMetrics.descent); paint.setStyle(Paint.Style.STROKE ); paint.setAntiAlias(true); paint.setTextAlign(Paint.Align.CENTER); Paint.FontMetrics fontMetrics = paint.getFontMetrics(); final int textCenterX = (mSize - mRightMarginPx / 2) / 2; int textBaselineY = (int) (y - fontMetrics.descent / 2); final String tag = text.subSequence
在解决这个问题之前,先学习字体属性Paint.FontMetrics。 ? 图片1 ? 图片2 通过上面的示意图,再看下FontMetrics 类: public static class FontMetrics { /** * The maximum
if (TextUtils.isEmpty(mTextString)) { mTextString = ""; } Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics(); mTextHeight = fontMetrics.bottom; } TypedArray Paint.FontMetrics解析: ? if (TextUtils.isEmpty(mTextString)) { mTextString = ""; } Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics(); mTextHeight = fontMetrics.bottom; } @Override
(mTitleText); // int textHeight = mRect.height(); //直接计算出来的会有误差 Paint.FontMetrics fontMetrics = mPaint.getFontMetrics(); float textHeight = Math.abs((fontMetrics.bottom - fontMetrics.top)); 1.2 onDraw里画Text时起点坐标优化: canvas.drawText(mTitleText, getWidth() / 2 - mRect.width
QWidget::fontMetrics()函数返回一个QFontMetrics对象;可以用这个对象查询并获得与这个窗口部件字体相关的信息。 QSize Ticker::sizeHint() const { return fontMetrics().size(0, text()); } 4.paintEvent事件 paintEvent 它使用fontMetrics()确定文本在水平方向上所需要的空间,并且在考虑offset值的同时,多次绘制文本,直到能够填充整个窗口部件的宽度为止。 void Ticker::paintEvent(QPaintEvent *event) { QPainter painter(this); int textWidth = fontMetrics QTimerEvent *event) { if(event->timerId() == myTimerId) { ++offset; if(offset >= fontMetrics
progress / maxProgress, false, pgPaint); } private void drawText(Canvas canvas) { Paint.FontMetrics m = new Paint.FontMetrics(); textPaint.getFontMetrics(m); int baseLine = (int) (getMeasuredHeight
import java.awt.image.BufferedImage; public class RenderFontAWT implements RenderFont { private FontMetrics ); Font awtFont = new Font("黑体", java.awt.Font.PLAIN, 12); fontMetrics = image.createGraphics () + fontMetrics.getMaxDescent()); } @Override public int getCharacterAdvance(char currentCharacter fontMetrics; private Font awtFont = null; private NiftyJmeDisplay display; private RenderManager (str), fontMetrics.getMaxAscent() + fontMetrics.getMaxDescent(), BufferedImage.TYPE_INT_ARGB
canvas.drawText()会发现,可能会出现文字不在矩形的中心,解决办法参看这篇博客,Android Canvas drawText实现中文垂直居中, Paint.FontMetricsInt fontMetrics = mSorlarPaint.getFontMetricsInt(); int baseline = (rect.bottom + rect.top - fontMetrics.bottom - fontMetrics.top DateTime dateTime = monthDateTimeList.get(i * 7 + j); Paint.FontMetricsInt fontMetrics = mSorlarPaint.getFontMetricsInt(); int baseline = (rect.bottom + rect.top - fontMetrics.bottom - fontMetrics.top) / 2; //判断是不是当月,当月和上下月的颜色不同 if (Utils.isEqualsMonth
FontMetrics 提供的就是 Paint 根据当前字体和字号,得出的这些值的推荐值。它把这些值以变量的形式存储,供开发者需要时使用。 FontMetrics.ascent:float 类型。 FontMetrics.descent:float 类型。 FontMetrics.top:float 类型。 FontMetrics.bottom:float 类型。 getFontMetrics() 的返回值是 FontMetrics 类型。 它还有一个重载方法 getFontMetrics(FontMetrics fontMetrics) ,计算结果会直接填进传入的 FontMetrics 对象,而不是重新创建一个对象。 这种用法在需要频繁获取 FontMetrics 的时候性能会好些。