Android canvas中的drawText居中问题

自定义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:大功告成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值