自定义view是绘制文本有三类方法@H_502_1@
// 第一类public voID drawText (String text,float x,float y,Paint paint)public voID drawText (String text,int start,int end,Paint paint)public voID drawText (CharSequence text,Paint paint)public voID drawText (char[] text,int index,int count,Paint paint)// 第二类public voID drawPosText (String text,float[] pos,Paint paint)public voID drawPosText (char[] text,Paint paint)// 第三类public voID drawTextOnPath (String text,Path path,float hOffset,float vOffset,Paint paint)public voID drawTextOnPath (char[] text,Paint paint)
其中drawText()最常用,drawPosText ()是根据一个个坐标点指定文字位置,drawTextOnPath ()是根据路径绘制。但drawText()的x,y参数是干嘛的呢?@H_502_1@
先来测试下@H_502_1@
Paint paint=new Paint(); paint.setStyle(Paint.Style.FILL); paint.setstrokeWIDth(12); paint.setTextSize(100); String text="测试:my text"; canvas.drawText(text,200,400,paint); //画两条线标记位置 paint.setstrokeWIDth(4); paint.setcolor(color.RED); canvas.drawline(0,2000,paint); paint.setcolor(color.BLUE); canvas.drawline(200,paint);
@H_502_1@@H_502_1@
左对齐-left@H_502_1@
可以看到,x,y并不是指定文字的中点位置,并且x,y与文字对齐方式有关(通过setTextAlign()指定,默认为left)@H_502_1@
@H_502_1@@H_502_1@
居中对齐-center@H_502_1@
@H_502_1@@H_502_1@
右对齐-right@H_502_1@
(为了使文字完整,上面调整了下x,y的值)@H_502_1@
从上面三种情况得出结论,x所对应的竖线:@H_502_1@左对齐 — 文字的左边界居中对齐 — 文字的中心位置右对齐 — 文字的左边界
y对应的横线并不是文字的下边界,而是基准线Baseline@H_502_1@
看下面这张图@H_502_1@
@H_502_1@@H_502_1@
红色的Baseline是基准线,紫色的top是文字的最顶部,也就是在drawText()中指定的x所对应,橙色的Bottom是文字的底部。@H_502_1@
拿这些值如何获取呢?@H_502_1@
Paint.FontMetrics FontMetrics=paint.getFontMetrics(); FontMetrics.top FontMetrics.ascent FontMetrics.descent FontMetrics.bottom
记得要在设置完Paint的文字大小,宽度之类属性后再获取FontMetrics,
baseline对应对应值为0,在它下面的descent和bottom值为正,top和ascent为负。那文字的高度为bottom - top@H_502_1@
@H_502_1@@H_502_1@
所以,实际绘制的时候取决于基线上一个点来绘制文字,而这个点有三种分别对应为left,center,right@H_502_1@
@H_502_1@@H_502_1@
好啦,把drawText()中x,y参数讲清楚后实现文字居中就很容易了@H_502_1@
直接上代码@H_502_1@
//矩形背景 Paint bgRect=new Paint(); bgRect.setStyle(Paint.Style.FILL); bgRect.setcolor(color.YELLOW); RectF rectF=new RectF(200,800,600); canvas.drawRect(rectF,bgRect); Paint textPaint=new Paint(); textPaint.setStyle(Paint.Style.FILL); textPaint.setstrokeWIDth(8); textPaint.setTextSize(50); textPaint.setTextAlign(Paint.Align.CENTER); String text="测试:my text"; //计算baseline Paint.FontMetrics FontMetrics=textPaint.getFontMetrics(); float distance=(FontMetrics.bottom - FontMetrics.top)/2 - FontMetrics.bottom; float baseline=rectF.centerY()+distance; canvas.drawText(text,rectF.centerX(),baseline,textPaint);
效果@H_502_1@
@H_502_1@@H_502_1@
将对齐方式设置为center,那要让文字居中显示,x值就为矩形中心x值,y值也就是baseline的计算看下图@H_502_1@
@H_502_1@@H_502_1@
y = 矩形中心y值 + 矩形中心与基线的距离@H_502_1@
距离 = 文字高度的一半 - 基线到文字底部的距离(也就是bottom) = (FontMetrics.bottom - FontMetrics.top)/2 - FontMetrics.bottom
总结@H_502_1@
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。@H_502_1@ 总结
以上是内存溢出为你收集整理的Android Canvas的drawText()与文字居中方案详解全部内容,希望文章能够帮你解决Android Canvas的drawText()与文字居中方案详解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)