Android 之 TextView内部如何绘制Span样式
2013-02-25 10:51
453 查看
1 Span用处:可以修改TextView中的部分文字的字体,如加粗、下划线、修改颜色、行对齐方式、首行缩进、插入图片等等。具体 android.text.style.* 中寻找自己想要的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,另一种是CharacterStyle。ParagraphStyle是用在段落的Span,而CharacterStyle是用在文字上的Span。
CharacterStyle又分为两种类型,一种是ReplacementSpan,一种是CharacterStyle本身。
如果TextLine遇到CharacterStyle则直接调用它的updateDrawState(TextPaint)方法对样式进行修改,然后再把文本绘制出来。否则会调用ReplacementSpan的draw方法代替文本的绘制。
所以,如果想自己重写一个Span,则需考虑这个使用哪一种类型Span,比如我想写一个原笔迹显示代替文本显示的Span则需继承ReplacementSpan然后重写ReplacementSpan的draw方法显示出原笔迹即可。
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,另一种是CharacterStyle。ParagraphStyle是用在段落的Span,而CharacterStyle是用在文字上的Span。
CharacterStyle又分为两种类型,一种是ReplacementSpan,一种是CharacterStyle本身。
如果TextLine遇到CharacterStyle则直接调用它的updateDrawState(TextPaint)方法对样式进行修改,然后再把文本绘制出来。否则会调用ReplacementSpan的draw方法代替文本的绘制。
所以,如果想自己重写一个Span,则需考虑这个使用哪一种类型Span,比如我想写一个原笔迹显示代替文本显示的Span则需继承ReplacementSpan然后重写ReplacementSpan的draw方法显示出原笔迹即可。
相关文章推荐
- Android笔记之TextView内部文字样式自定义
- android 如何判断一个 View textview imageview etc 是否绘制完成
- AndroidのTextView背景色、圆角、内部填充设置样式
- Android之TextView的样式类Span的使用详解
- Android用户界面 UI组件--TextView及其子类(三) EditView以及各种Span文字样式讲解
- Android 如何改变TextView中个别字样式
- Android之TextView的Span样式源代码剖析
- Android用户界面 UI组件--TextView及其子类(三) EditView以及各种Span文字样式讲解
- Android之TextView的Span样式源码剖析
- Android之TextView的样式类Span的使用具体解释
- Android TextView如何显示html样式的文字
- 【Android】在控件、视图绘制或改变之后如何获取其部分状态和属性(比如高、宽、TextView绘制后的文字行数等)
- Android中的如何在代码中使用64位颜色值改变TextView的颜色的方法
- android如何在textview或edittext上添加表情
- android 一个textview里设置字体的样式
- 50个Android开发技巧(10 为TextView添加样式)
- Android上如何让TextView上的字体放大且自滚动
- Android中TextView通过SpannableString设置字体、大小、颜色、样式、超级链接
- Android TextView设置个别字体样式
- Android中EditText(或TextView)中的InputType类型含义与如何定义