位置: 编程技术 - 正文

Android之TextView的Span样式源码剖析(textview在哪)

编辑:rootadmin
Android中的TextView是个显示文字的的UI类,在现实中的需求中,文字有各式各样的样式,TextView本身没有属性去设置实现,我们可以通过Android提供的 SpannableString类封装。Android提供了很多的Span的类去实现样式,这个样式都是继承自CharacterStyle类。 在上一篇博客中详细的介绍的怎么使用各种Span类,这篇博客主要是通过看源码,来分析Span的工作原理,内部的类结构,继承结构,从而达到我们自己可以自定义一个Span来使用。 要想剖析Span的原理,我们就需要看懂TextView的大概的绘制流程,一个TextView中的类&#;是很复杂的,一点一点看源码,找顺序。 首先,在CharcaterStyle类中具有 public abstract void updateDrawState(TextPaint tp); 方法,TextPaint是画笔,我个人认为TextPaint没啥作用,直接当作Paint去看就行了。既然updateDrawState需要Paint,那么就需要在TextView中的onDraw去调用这个方法,在onDraw方法中传递给画Text的画笔,这个方法才能起作用,那我们顺着看TextView中的onDraw方法,代码太多,我只贴关键代码。 在TextView的onDraw方法中只有下面的方法调用到了画笔。 Path highlight = getUpdatedHighlightPath(); if (mEditor != null) { mEditor.onDraw(canvas, layout, highlight, mHighlightPaint, cursorOffsetVertical); } else { layout.draw(canvas, highlight, mHighlightPaint, cursorOffsetVertical); } if (mMarquee != null && mMarquee.shouldDrawGhost()) { canvas.translate((int) mMarquee.getGhostOffset(), 0.0f); layout.draw(canvas, highlight, mHighlightPaint, cursorOffsetVertical); } 这里可以发现有两个类:Editor和Layout,TextView的onDraw就是在这两个类中去绘制的,继续分别看这两个类的作用。1.Editor:还没找到出处代码。放下搁置以后再说2.Layout:可以看到Layout有三个子类,BoringLayout、DynamicLayout、StaticLayout,这三个类是一些功能的封装,主要的实现还都是在Layout中,我们看一下Layout中的代码: public void draw(Canvas canvas, Path highlight, Paint highlightPaint, int cursorOffsetVertical) { final long lineRange = getLineRangeForDraw(canvas); int firstLine = TextUtils.unpackRangeStartFromLong(lineRange); int lastLine = TextUtils.unpackRangeEndFromLong(lineRange); if (lastLine < 0) return; drawBackground(canvas, highlight, highlightPaint, cursorOffsetVertical, firstLine, lastLine); drawText(canvas, firstLine, lastLine); }drawBackground 绘制背景drawText 绘制文字找到了关键的代码了。接着看drawText中的源码: if (directions == DIRS_ALL_LEFT_TO_RIGHT && !mSpannedText && !hasTabOrEmoji) { // XXX: assumes there's nothing additional to be done canvas.drawText(buf, start, end, x, lbaseline, paint); } else { tl.set(paint, buf, start, end, dir, directions, hasTabOrEmoji, tabStops); tl.draw(canvas, x, ltop, lbaseline, lbottom); } 可以看到的是有个判断条件的,直接就可以绘制文字的,但是我们还没找到有关Span的代码啊,难道没有,不要着急,还有tl.draw。看源码: ReplacementSpan replacement = null; for (int j = 0; j < mMetricAffectingSpanSpanSet.numberOfSpans; j&#;&#;) { // Both intervals [spanStarts..spanEnds] and [mStart &#; i..mStart &#; mlimit] are NOT // empty by construction. This special case in getSpans() explains the >= & <= tests if ((mMetricAffectingSpanSpanSet.spanStarts[j] >= mStart &#; mlimit) || (mMetricAffectingSpanSpanSet.spanEnds[j] <= mStart &#; i)) continue; MetricAffectingSpan span = mMetricAffectingSpanSpanSet.spans[j]; if (span instanceof ReplacementSpan) { replacement = (ReplacementSpan)span; } else { // We might have a replacement that uses the draw // state, otherwise measure state would suffice. span.updateDrawState(wp); } } Ok ,终于找到了Span的出处了。 我们可以总结一下TextView绘制流程了。TextView的onDraw----》Layout的draw----》TextLine的Draw----》CharacterStyle的updateDrawState(如果设置的有Span样式)绘制的主要的代码还是在Layout的Draw中和TextLine的Draw中。从类的继承结构图中我简单的CharacterStyle分为两类:一个是直接继承CharacterStyle的,另一个ReplacementSpan。第一种:直接继承CharacterStyle的样式是主要跟Paint相关的,只需要更改画笔中的设置即可达到更改目的的。第二种:继承ReplacementSpan的,在ReplacementSpan中有Draw的方法, public abstract void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint);我们可以直接通过操作canvas去自己绘制,你想要怎么绘制,不就完全的听你的么???

推荐整理分享Android之TextView的Span样式源码剖析(textview在哪),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:安卓设置textview内容,安卓textview设置文本,android中textview,android textview设置字体,android中textview,android的textview怎么水平居中,安卓textview设置文本,安卓中textview,内容如对您有帮助,希望把文章链接给更多的朋友!

分类之后,我们就可以了解到以后如果需要自定义Span的时候,就可以去选择性的去继承类了。

Android之TextView的Span样式源码剖析(textview在哪)

我的博客园地址:

版权声明:本文为博主原创文章,未经博主允许不得转载。

[置顶] 在Android程序中使用已有的SQLite数据库 在之前做的联系人项目中,应用安装完以后需要显示数据库中预存的数据,这时需要导入已有的数据库contact.db。这也是一个面试题,那么如何实现呢?

Genymation怎样设置联网 学习使用百度地图进行开发,但是发现Genymotion模拟器不能连接因特网,这直接导致了不能加载百度地图。经过了一番搜索,找到了解决方法,具体方法

去除警告 Android NDK: WARNING: APP_PLATFORM Android- Is Larger Than android:minSdkVersion 8 问题:去除警告AndroidNDK:WARNING:APP_PLATFORMAndroid-IsLargerThanandroid:minSdkVersion8解决方法:在项目里的jni/Application.mk文件里加入一行APP_PLATFORM:=android-8即可.为什么

标签: textview在哪

本文链接地址:https://www.jiuchutong.com/biancheng/374343.html 转载请保留说明!

上一篇:滑动到点击位置的ListView(滑动到点击位置的快捷键)

下一篇:[置顶] 在Android程序中使用已有的SQLite数据库(置顶在哪里)

  • 去税局更正申报需要什么资料,忘记带营业执照
  • 缴纳城镇土地使用税标准
  • 个人所得税的税点是多少钱
  • 固定资产处置收入怎么报税
  • 个人所得税累计扣除标准
  • 总账和成本哪个工资高
  • 公司银行未开户税务也没开需要做工商年报吗
  • 软件公司企业成本预测
  • 小规模和纳税人一般怎么选择
  • 个人所得税交税怎么交的
  • 股票收入属于按什么分类
  • 高薪技术企业研发人员人数
  • 安全生产专项资金绩效目标
  • 其他业务支出借方表示什么成本数额
  • 汽车折旧年份
  • 公司购买设备24套
  • 小规模转为一般纳税人最新规定
  • 电信宽带费发票专票
  • 物管费开票可以开公司名称吗
  • 劳务派遣企业如何认定
  • 劳保用品计入福利费嘛
  • 房地产公司基础设施建设费包括哪些费用
  • 个人投资者
  • 借贷在会计中的增和减
  • 独立核算的分公司可以享受小微企业吗
  • 原材料意外损失会计分录
  • 研发费用归集会计分录
  • 小规模纳税人的条件
  • 商贸企业零部件出口退税政策
  • cpu性能天梯图2023年3月
  • 电脑非法关机后开机进不了系统
  • 怎么做才能让电脑里自动翻译成中文
  • php的强大功能函数库中都含有哪些常用函数?
  • 佣金代扣代缴增值税还有附加税吗
  • PHP:Memcached::append()的用法_Memcached类
  • 增值税不允许抵扣计入什么科目
  • 基于transformer的文本分类
  • 超分辨率图像复原
  • 阿拉斯给加拉普
  • 增值税纳税申报表在哪里打印
  • 个人所得税申报流程图
  • layui框架模板
  • Emiller's Advanced Topics In Nginx Module Development
  • 微服务组件面试题
  • 出租设备折旧费用计入什么科目
  • 企业在建工程领用原材料的会计分录
  • 企业所得税季报营业成本包括哪些
  • 卖固定资产计入
  • mysql select语法的使用
  • sqlserver 比较时间
  • MySQL发生系统错误2和5
  • 盘盈材料会计分录
  • 公司签发银行承兑汇票的行为属于什么
  • 工会经费发放奖励个税处理
  • 营业外支出的计算公式
  • 入伙退伙协议要盖章吗
  • 企业的财务报表不包括
  • 公司组织员工吃饭或举行活动的行为被称为什么
  • 未完工属于什么科目
  • 开红字发票如何调整收入?
  • 生产线更新改造替换的旧设备
  • 计提短期借款利息分录
  • 企业所得税需要计提分录
  • sqlserver全文索引ndf文件丢失
  • mysql5.5解压版安装教程
  • select into 和 insert into select 两种表复制语句
  • WINDOWS SERVER 2008开启桌面主题具体步骤
  • mac怎样解压缩
  • winxp优化设置
  • windows 8怎么样
  • linux 网页
  • jQuery实现非常实用漂亮的select下拉菜单选择效果
  • python web开发环境搭建
  • jquery结合html实现中英文页面切换
  • centos安装完成后桌面没有图标
  • jQuery+JSON实现AJAX二级联动实例分析
  • jQuery对checkbox 复选框的全选全不选反选的操作
  • 猫的游戏视频
  • 税控盘解除风险
  • 美国对中国商品征收关税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设