自定义View 中的三步曲大家肯定是非常熟悉了,莫过于onMeasure(0测试控件 ,onLayout()布局近件,onDraw()绘制控件
在自定义View 中drawText();的使用频率算是比较高了,如果最近在研究的城市列表侧滑菜单什么的。
具体使用就去如下:
canvas.drawText(text, x, y, paint);
第一个参数:
text 为要绘制的内容
第二个参数:
为绘制内容的x坐标的起点。
第三个参数:
y是指定这个字符baseline在屏幕上的位置
第四个参数:
为画笔。
下面为大家写几个字
String name="测试";
Rect bounds=new Rect();
mPaint.getTextBounds(name, 0, name.length(), bounds);
mPaint.setColor(Color.WHITE);
canvas.drawRect(0, 0, width, width, mPaint);
mPaint.setColor(Color.BLUE);
canvas.drawText(name,0, 0, mPaint);
效果如下:
图1
我们可以看到基本无法直视。
那么我们需要的效果是什么呢?我们需要的是能够居中显示图片。
x轴的计算方式如下:
<pre name="code" class="java" style="font-size: 18px;">
Rect bounds=new Rect();
mPaint.getTextBounds(name, 0, name.length(), bounds);
canvas.drawText(name,(width-bounds.width())/2, y, mPaint);
那么y轴该如何获取呢?
第一种方法:
FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();
int baseline = (width - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
canvas.drawText(name,(width-bounds.width())/2, baseline, mPaint);
此方法来源于网络 ,具体实现还未查证。
第二种方法
baseline=width/2+bounds.height()/2;
canvas.drawText(name,(width-bounds.width())/2,baseline, mPaint);
图2
刚开始以为居中了,后来发现还是多少有点差距。
稍微向下了一点,根据图1,我们发现文字本来应该是全部隐藏显示的,可是却露了一部分,我们直接width-bounds.width()/2 表面上看baseline在居中位置。bounds.top=-51,bounds.bottom=5;正好是差了这一部分。
最终结果为
baseline=width/2+bounds.height()/2-bounds.bottom;
canvas.drawText(name,(width-bounds.width())/2,baseline, mPaint);
效果如下
ok:大功告成。