本来这篇文章是要写写我在设计高级跑马灯程序的心得的,但是编写过程中花了近一天多的时间搞明白canvas.drawText中的第三个参数[float y]代表的真实含义。学习本文应该能帮助大家掌握FontMetrics类和Rect类成员变量值具体含义。
drawText引出问题
先来看看api中是如何定义drawText的参数。
/**
* Draw the text, with origin at (x,y), using the specified paint. The
* origin is interpreted based on the Align setting in the paint.
*
* @param text The text to be drawn
* @param x The x-coordinate of the origin of the text being drawn
* @param y The y-coordinate of the baseline of the text being drawn
* @param paint The paint used for the text (e.g. color, size, style)
*/
public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint) {
native_drawText(mNativeCanvasWrapper, text, 0, text.length(), x, y, paint.mBidiFlags,
paint.getNativeInstance(), paint.mNativeTypeface);
}
简单解释下各参数:
@param text:要显示的文本内容,这个不难理解。
@param x:文本相对屏幕原点x方向距离,没有更深的含义,也比较好理解
@param y:文本的baseline相对屏幕原点y方向距离。好,问题来了,baseline是个什么鬼东东
@param paint:画笔
baseline的来龙去脉
先看看baseline在文字区域的位置。通过一个实例来分析,这里只贴主要的code。
@Override
protected void onDraw(Canvas canvas) {
//super.onDraw(canvas);
mRect = new Rect();
mPaint = new Paint();
mPaint.setTextSize(64);
mPaint.setColor(Color.RED);
Paint.FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();
mPaint.getTextBounds(textStr, 0, textStr.length(), mRect);
int w = mRect.wid