自定义View学习笔记07—Canvas绘制文字

这里我们接着上一篇笔记没有讲完的内容:用canvas绘制文字,这个在自定义View尤其是定义线性View的时候作用非常大。
我们还是依照惯例先看看API提供的关于文字绘制的方法:

//第一类:只能指定文本基线位置(基线x默认在字符串左侧,基线y默认在字符串下方)
public void drawText(String text, float x, float y, Paint paint)
public void drawText(String text, int start, int end, float x, float y, Paint paint)
public void drawText(char text,int start,int end,float x,float y,Paint paint)
public void drawText(char[]text,int index,int count,float x,float y,Paint paint)

// 第二类:可以分别指定每个文字的位置
public void drawPosText(String text,float[]pos,Paint paint)
public void drawPosText(char[]text,int index,int count,float[]pos, Paint paint)

// 第三类:指定一个路径,根据路径绘制文字
public void drawTextOnPath(String text,Path path float hOff, float vOff,Paint paint)
public void drawTextOnPath(char[]text,int index,int count,Path path,float hOff,float vOff,Paint paint) 

通过上面常用方法的参数也可看出,绘制文字也是需要画笔的,而且文字的大小,颜色,字体,对齐方式都是由画笔控制的。

画笔Paint关于文本绘制涉及的常用方法:
画笔Paint关于文本绘制涉及的常用方法

绘制文本前的准备工作:创建画笔paint:

private void initPaint(){
    Paint mPaint = new Paint();// 创建画笔
    mPaint.setColor(Color.BLUE);// 设置颜色
    mPaint.setStrokeWidth(16);//设置画笔宽度
    mPaint.setStyle(Paint.Style.FILL);// 设置样式
    mPaint.setAntiAlias(true);//防锯齿
    mPaint.setTextSize(100);// 设置字体大小
}

在构造方法中调用上述方法。

现在开始正式的文本绘制:

第一类方法drawText:
只能指定文本基线位置,基线x默认在字符串左侧,基线y默认在字符串下方。
虽然一共有四个方法,但都大同小异。都是在自定位置显示指定的字符串,只不过是要显示的字符串的指定方式不太一样,仅此而已。

在onDraw()方法中调用以下方法:

private void drawText(Canvas canvas){
	String string = "皓月公子";
    //文字的绘制以起始坐标左对齐(对齐方式也分左对齐,右对齐和居中对齐,分别对应
    //Paint.Align.LEFT/RIGHT/CENTER,跟Office里面的对齐概念是一样的。)
    mPaint.setTextAlign(Paint.Align.LEFT);
    Rect rect = new Rect();
    //获取文本所占用的最小矩形并将参数保存在rect中,可以通过rect.height()
    //和rect.width()方法获取,也可以通过rect.left、rect.toprect.left、rect.right
    //分别获取自行计算        
    mPaint.getTextBounds(string, 0, string.length(), rect);
    //指定绘制字符串的起始坐标(300,,150)
    canvas.drawText(string, 300, 150, mPaint);
    //绘制string里面的起始位置为1,结束位置为3的指定字符串
    //指定绘制字符串的起始坐标(300, 300)
    canvas.drawText(string, 1, 3, 300, 300, mPaint);
}

运行效果如下:
canvas.drawText绘制文本

第二类(drawPosText):
一共有两个方法,但本质都是一回事:欲绘制的文本类型为String型或者char[]型,并为String型或者char[]型里面的每个字符指定位置坐标。由于要为每个字符指定坐标,是一件很反人类的设计,因此很少用,使用得比较少,理解就行,在此不做深究。

第三类(drawTextOnPath):
这是一个使用得很广泛的超级大杀器,因为要用到path这个大杀器,当然咯,杀器级别的对象不能很快就上场,必须留点悬念。这个我们稍后细说。

下面看看所绘文字宽度、高度和最小矩形获取:
注:所绘文字的宽度、高度均小于最小矩形(装文字的容器)的宽度和高度

A、高度:

Paint.FontMetricsInt fm = paint.getFontMetricsInt();
int top = fm.top;				int bottom = fm.bottom;
//所占高度
int heightString = bottom - top;

B、宽度:

//获取到的是字符串的宽度
float widthString = mPaint.measureText(centerString);

C、最小矩形:

Rect rect = new Rect();		
mPaint.getTextBounds(string, 0, string.length(), rect);
int heightView = rect.bottom - rect.top;				
int widthView = rect.right - rect.left;
int L = rect.width();								
int H = rect.height();

运行代码得出:heightView = H,widthView = L;如下:
这里写图片描述

注意:
a、上面的数据中,文字的宽度widthString < 最小矩形的宽度widthView(L),文字的高度heightString <最小矩形的高度heightView(H);
b、以上代码是基于文本绘制时基线为默认值时测出的,如果自定义View过程中设置了基线baseLineX、baseLineY,在计算的时候,应考虑基线参数:

//画text所占的区域,baseLineY 为int型数据
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);

Canvas绘制文字的学习暂告一段落。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值