此时我是相对于整个View居中所以就谢了getWidth()/2``canvas.drawText("this is a test", getWidth() / 2, baseLineY, textPaint);
Y轴居中要给予baseLine,这个baseLine的概念就是字符串字的最底部.如果此值传入getHeight()/2
的话那么baseLine的基点就在View的中间,从而导致文字居中偏上.如下图.绿色的线是居中的
此时的代码是这样的:
canvas.drawText("this is a test", getWidth() / 2, /*baseLineY*/getHeight() / 2, textPaint);
如果要让文字绝对居中,就要计算出文字的baseLine调整策略,要根据以下信息:
Paint textPaint = new Paint();
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(DensityUtil.dip2px(20));
textPaint.setStyle(Paint.Style.FILL);
textPaint.setTextAlign(Paint.Align.CENTER);
Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
float top = fontMetrics.top;
float bottom = fontMetrics.bottom;
Log.d(TAG, "getWidth(): " + getWidth() + " getHeight() " + getHeight() +" top "+top +" bottom "+bottom);
此时这段代码打印出来的结果是:
getWidth(): 400 getHeight() 200 top -42.246094 bottom 10.839844
top就是baseLine到字体上方的距离.bottom亦然.
由此得出 字体的高度-基线到字体底部 = 字体中心点(基线到底部的距离是没有字体存在的)
得出公式为:view高度的一半-字体中心点为 字体应该居中的点.
完整代码如下:
Rect rect = new Rect(0, 0, getWidth(), getHeight());
Log.d(TAG, "onDraw: " + rect);
Paint textPaint = new Paint();
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(DensityUtil.dip2px(20));
textPaint.setStyle(Paint.Style.FILL);
textPaint.setTextAlign(Paint.Align.CENTER);
Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
float top = fontMetrics.top;
float bottom = fontMetrics.bottom;
Log.d(TAG, "getWidth(): " + getWidth() + " getHeight() " + getHeight() / 2 + " top " + top + " bottom " + bottom);
int baseLineY = (int) (getHeight() / 2 - top / 2 - bottom / 2);
Log.d(TAG, "onDraw: " + baseLineY + " rect.centerY() " + rect.centerY());
canvas.drawText("this is a test", getWidth() / 2, baseLineY/*getHeight() / 2*/, textPaint);
Paint paint = new Paint();
paint.setColor(Color.GREEN);
canvas.drawLine(0, getHeight() / 2, getWidth(), getHeight() / 2, paint);
最终效果如图:
© 著作权归作者所有
文章评论(0)