自定义控件(28)---drawText、FontMetrics学习
来源:互联网 发布:淘宝买家一星需要几单 编辑:程序博客网 时间:2024/05/22 13:04
这几天发现单单绘制一个文字,是需要好多需要注意的地方,特地弄一个博客,摘摘代码,来学习下,博客内容转自
自定义控件之绘图篇( 五):drawText()详解
1、canvas.drawText()
protected void onDraw(Canvas canvas) { super.onDraw(canvas); int baseLineX = 0 ; int baseLineY = 200; //画基线 Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawLine(baseLineX, baseLineY, 3000, baseLineY, paint); //写文字 paint.setColor(Color.GREEN); paint.setTextSize(120); //以px为单位 canvas.drawText("harvic\'s blog", baseLineX, baseLineY, paint); }
效果图如下
2、paint.setTextAlign(Paint.Align.XXX);
我们知道,我们在drawText(text, x, y, paint)中传进去的源点坐标(x,y);其中,y表示的基线的位置。那x代表什么呢?从上面的例子运行结果来看,应当是文字开始绘制的地方。
并不是!x代表所要绘制文字所在矩形的相对位置。
paint.setTextAlign(Paint.Align.CENTER);
paint.setTextAlign(Paint.Align.RIGHT);
3、FontMetrics
除了基线以外,如上图所示,另外还有四条线,分别是ascent,descent,top,bottom,他们的意义分别是:
ascent: 系统建议的,绘制单个字符时,字符应当的最高高度所在线descent:系统建议的,绘制单个字符时,字符应当的最低高度所在线top: 可绘制的最高高度所在线bottom: 可绘制的最低高度所在线
FontMetrics来计算ascent,descent,top,bottom这些线的位置
ascent = ascent线的y坐标 - baseline线的y坐标;descent = descent线的y坐标 - baseline线的y坐标;top = top线的y坐标 - baseline线的y坐标;bottom = bottom线的y坐标 - baseline线的y坐标;
FontMetrics的这几个变量的值都是以baseline为基准的,对于ascent来说,baseline线在ascent线之下,所以必然baseline的y值要大于ascent线的y值,所以ascent变量的值是负的。
descent线在baseline线之下,所以必然descent线的y坐标要大于baseline线的y坐标,所以descent变量的值必然是正数。
ascent线Y坐标 = baseline线的y坐标 + fontMetric.ascent;
descent线Y坐标 = baseline线的y坐标 + fontMetric.descent;
top线Y坐标 = baseline线的y坐标 + fontMetric.top;
bottom线Y坐标 = baseline线的y坐标 + fontMetric.bottom;
ascent线Y坐标 - baseline线的y坐标 = fontMetric.ascent;
descent线Y坐标 - baseline线的y坐标 = fontMetric.descent;
top线Y坐标 - baseline线的y坐标 = fontMetric.top;
bottom线Y坐标 - baseline线的y坐标 = fontMetric.bottom;
4、字体的宽高、最小矩形
(1)、高度
Paint.FontMetricsInt fm = paint.getFontMetricsInt(); int top = baseLineY + fm.top; int bottom = baseLineY + fm.bottom; //所占高度 int height = bottom - top;
(2)、宽度
Paint paint = new Paint(); //设置paint paint.setTextSize(120); //以px为单位 //获取宽度 int width = (int)paint.measureText("harvic\'s blog");
(3)、最小矩形
/** * 获取指定字符串所对应的最小矩形,以(0,0)点所在位置为基线 * @param text 要测量最小矩形的字符串 * @param start 要测量起始字符在字符串中的索引 * @param end 所要测量的字符的长度 * @param bounds 接收测量结果 */ String text = "harvic\'s blog"; Paint paint = new Paint(); //设置paint paint.setTextSize(120); //以px为单位 Rect minRect = new Rect(); paint.getTextBounds(text,0,text.length(),minRect); Log.e("qijian",minRect.toShortString());
protected void onDraw(Canvas canvas) { super.onDraw(canvas); String text = "harvic\'s blog"; int baseLineY = 200; int baseLineX = 0 ; //设置paint Paint paint = new Paint(); paint.setTextSize(120); //以px为单位 paint.setTextAlign(Paint.Align.LEFT); //画text所占的区域 Paint.FontMetricsInt fm = paint.getFontMetricsInt(); int top = baseLineY + fm.top; int bottom = baseLineY + fm.bottom; int width = (int)paint.measureText(text); Rect rect = new Rect(baseLineX,top,baseLineX+width,bottom); paint.setColor(Color.GREEN); canvas.drawRect(rect,paint); //画最小矩形 Rect minRect = new Rect(); paint.getTextBounds(text,0,text.length(),minRect); minRect.top = baseLineY + minRect.top; minRect.bottom = baseLineY + minRect.bottom; paint.setColor(Color.RED); canvas.drawRect(minRect,paint); //写文字 paint.setColor(Color.BLACK); canvas.drawText(text, baseLineX, baseLineY, paint); }
代码中。
Rect minRect = new Rect(); paint.getTextBounds(text,0,text.length(),minRect); minRect.top = baseLineY + minRect.top; minRect.bottom = baseLineY + minRect.bottom; paint.setColor(Color.RED); canvas.drawRect(minRect,paint);
首先根据paint.getTextBounds()得到基线为y=0的最小矩形的各点坐标,然后根据基线得到其实际的top和bottom坐标;然后将其画出来即可
- 自定义控件(28)---drawText、FontMetrics学习
- 重新认识FontMetrics、Canvas.drawText
- 自定义控件之绘图篇( 五):drawText()详解
- 自定义控件之绘图篇( 五):drawText()详解
- 自定义控件之绘图篇( 五):drawText()详解
- 自定义控件之drawText()方法理解
- 自定义控件之绘图篇:drawText详解
- Android自定义控件---DrawText 基线的确定
- 自定义控件之绘图篇:drawText()详解
- Android绘图drawText垂直居中与FontMetrics
- 自定义控件之绘图篇(五) —— drawText()详解
- 自定义View之绘图篇(四):baseLine和FontMetrics
- 自定义View之绘图篇(四):baseLine和FontMetrics
- android自定义控件canvas.drawText()的坐标问题
- Android自定义控件drawText的baseline的问题
- Android FontMetrics 学习笔记
- FontMetrics
- FontMetrics
- spring读取配置文件初始化容器操作总结
- CSS web页面自适应屏幕
- iOS中storyboard故事板使用Segue跳转界面、传值
- 在Unity中通过NGUI UITexture制作动态聊天表情
- URL编码表
- 自定义控件(28)---drawText、FontMetrics学习
- 设计模式
- 几率与概率
- Tyvj P1363 火车进出栈问题(catalan数+高精度) pascal
- ORACLE日期时间函数大全
- App软件测试点总结
- markdown语法
- iOS中UIActionSheet的使用
- 【PAT甲级】1066. Root of AVL Tree (25)