自定义View-文字绘制

前言

文字绘制其实内容太细,而且可能不常用,确实我工作这么久,没用到过几次,这里就快速总结一下API,做下笔记吧。

绘制文字的方式:

// 最基本的方法drawText(), 注意很重要的一点,x,y的坐标是指文字左下角的坐标
canvas.drawText(text, x, y, paint);

// 对中国人没用,某些国家的文字形状会相互影响,单写是一个样儿, 和别的字连在一起又一个样
canvas.drawTextRun();

// 沿着一条Path来绘制文字, 拐弯处记得用圆角
canvas.drawTextOnPath(text, path, x, y, paint);

// 绘制多行文字,对文字的排列和样式没有太复杂的要求,使用StaticLayout
StaticLayout

Paint对文字绘制的辅助

// 设置文字大小
setTextSize(float size);

// 设置字体
setTypeface(Typeface typeface);

// 是否使用伪粗体
setFakeBoldText(boolean fakeBoldText);

// 是否使用删除线
setStrikeThruText(boolean strikeThruText);

// 是否加下划线
setUnderlineText(boolean underlineText);

// 设置文字横向错切角度,也就是倾斜角度
setTextSkewX(float skewX);

// 设置文字横向放缩,也就是胖瘦
setTextScaleX(float scaleX);

// 设置字符间距
setLetterSpacing(float letterSpacing);

// 通过CSS的font-feature-settings的方式来设置文字
setFontFeatureSettings("smcp");

// 设置文字的对齐方式
setTextAlign(Paint.Align align);

// 设置语言区域,比如简体中文、繁体中文
setTextLocale(Locale locale);

// 设置字体微调, 说白了就是字体太小的时候,为了能看的更细致,现在手机分辨率那么高,基本没用了
setHinting(int mode);

// 此方法对中国人没用,优化文字的高度,看起来更美观些
setElegantTextHeight(boolean elegant);

// 开启次像素级的抗锯齿
setSubpixelText(boolean subpixelText);

// 这个没搞懂
setLinearText(boolean linearText);

测量文字尺寸类

// 获取推荐的行距
getFontSpacing();

// 获取Paint的FontMetrics
getFontMetrics();

// 获取文字的显示范围
getTextBounds(text, start, end, bounds);

// 测量文字的宽度并返回
float measureText(text);

// 获取字符串中每个字符的宽度,并把结果填入widths
getTextWidths(String text, float[] widths);

// 测量文字宽度,在给出宽度上限的前提下测量文字的宽度,超出上限,就截断
int breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth);

// 计算某个字符处光标的X坐标
getRunAdvance(text, start, end, contextStart, contextEnd, isRtl, offset);

// 给出一个位置的像素值,计算文字中最接近这个位置的字符偏移量
getOffsetForAdvance(text, start, end, contextStart, contextEnd, isRtl, advance);

// 检查置顶的字符串中是否是一个单独的字形
hasGlyph(String string);

总结

1、关于文字绘制,最常用的可能只是drawText()

2、StaticLayout可以解决文字换行的问题

3、可以设置文字的大小,风格,什么删除线,下划线,字体倾斜,字体胖瘦,字符间距

4、可以测量文字的宽度,获取文字的显示范围等

这一章的内容真的是很细很细了,而且很多不常用,并不需要背会它们,而是知道有这么个东西,大概怎么用就行,真的用到了可以回来看一看。

贴个HenCoder的链接:自定义View-drawText()

分割线-------------------------------------------------------

实践

// 1 绘制文字
    canvas.drawText(text, 50, 100, paint);


// 2 绘制出带有换行的文字
    staticLayout = new StaticLayout(text, textPaint, 600, Layout.Alignment.ALIGN_NORMAL, 1, 0, true);
    canvas.save();
    canvas.translate(50, 40);
    staticLayout.draw(canvas);
    canvas.restore();

// 3 设置文字大小
    paint.setTextSize(20);


// 4 设置不同风格的字体
    paint.setTypeface(Typeface.SERIF);


// 5 设置伪粗体
    paint.setFakeBoldText(true);


// 6 设置删除线
    paint.setStrikeThruText(true);


// 7 设置下划线
    paint.setunderlineText(true);


// 8 设置文字倾斜
    paint.setTextSkewX(-0.5f);


// 9 设置文字变胖变瘦
    paint.setTextScaleX(1.2f);


// 10 设置文字对齐方法
    paint.setTextAlign(Paint.Align.LEFT);


// 11 获取推荐的行距
    paint.getFontSpacing();


// 12 测量出文字宽度,然后让文字相邻绘制
    float measureTextWidth = paint.measureText(text1);
    canvas.drawText(text1, 50, 200, paint1);
    canvas.drawText(text2, 50 + measureTextWidth, 200, paint2);


// 13 获取文字的显示范围
    // 通过paint.getTextBounds()方法获取文字显示范围矩形的大小
    // 用它们的top和bottom计算出中间值
    // 然后计算出文字的绘制位置
    // 这种算法可以让文字精准地居中


// 14 计算出文字的显示区域
    // 可以让不同的文字的baseline对齐
    paint.getFontMetrics();

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值