Android 之 TextView内部如何绘制Span样式

1 Span用处:可以修改TextView中的部分文字的字体,如加粗、下划线、修改颜色、行对齐方式、首行缩进、插入图片等等。具体 android.text.style.* 中寻找自己想要的Span。

Android <wbr>之 <wbr>TextView内部如何绘制Span样式

 

 

2 Span使用方法

SpannableString的setSpan(...)方法。然后TextView的setText方法中使用SpannableString代替String。(用SpannableStringBuilder代替String更佳)。

一个例子:

CharSequence mText = new SpannableStringBuilder("下划线");

mText.setSpan(new UnderlineSpan(), 0, mText.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

textView.setText(mText);

 

3 绘制Span的内部实现

 

一条重要线索

TextView --> DynamicLayout --> Layout的draw方法--> TextLine的draw方法

 

首先看TextView,在TextView中用于绘制文字的是Layout mLayout这个变量,这在TextView的onDraw方法中体现。当TextView发现显示的文字是继承自Spannable的(比如于SpannableString),mLayout这个类便初始化为DynamicLayout,否则为StaticLayout,在makeSingleLayout(...)方法中有体现。

 

DynamicLayout可以用于对文字Span样式的修改,而StaticLayout不可以,他们的主要不同在于DynamicLayout多了reflow()方法,reflow()方法用于。。。说不清楚,举个例子。

如:“我是绿色”。Span属性为绿色Span,index为从0到4。如果文字变为“我真的是绿色”,Span属性为绿色Span,index为从0到6。这个index的变化就是reflow()方法干的事情。

 

===============================丝丝分割线========================================

 

真正绘制的方法并不在DynamicLayout内,而是父类Layout的draw方法中。

在Layout中首先绘制了段落的背景颜色,然后分了行,然后所有的绘制操作交给了TextLine的draw方法来绘制每一行的文本。

 

Span分为两种类型,一种是ParagraphStyle,另一种是CharacterStyleParagraphStyle是用在段落的Span,而CharacterStyle是用在文字上的Span。

CharacterStyle又分为两种类型,一种是ReplacementSpan,一种是CharacterStyle本身。

如果TextLine遇到CharacterStyle则直接调用它的updateDrawState(TextPaint)方法对样式进行修改,然后再把文本绘制出来。否则会调用ReplacementSpan的draw方法代替文本的绘制。

 

所以,如果想自己重写一个Span,则需考虑这个使用哪一种类型Span,比如我想写一个原笔迹显示代替文本显示的Span则需继承ReplacementSpan然后重写ReplacementSpan的draw方法显示出原笔迹即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值