首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

真·富文本编辑器演进之路-【译】破解Span性能之谜

Layout以及两个子类StaticLayout和DynamicLayout,检查设置文本Span来计算行高和布局边距。...要做到这一点,很可能你会想调用textView.setText(CharSequence)两次:首先设置初始文本,然后在按钮被点击时再次调用。...选项1:多次调用textView.setText(CharSequence)--次优方案 当调用textView.setText(CharSequence)时,TextView创建一个Spannable...因此,当你需要更新文本样式时,你将不得不创建一个新Spannable,包含文本和Span,再次调用textView.setText,反过来,这将创建一个新对象副本。...再次调用setText导致不必要逻辑被触发和对象被创建,而视图只需要重新绘制重新测量即可。

1.3K10

论 Android 中 Span 正确打开方式

BufferType TextView LayoutParams 类型 等等 框架检查这些 Spanned 对象是否包含框架中不同类型 span,并触发相应行为。...文本布局和绘制背后逻辑是很复杂,并且遍布不同类;在这一节中,我们只能针对几种情况,简单地说明一下文本是如何被处理。...为此,你很有可能会调用 textView.setText(CharSequence) 两次:第一次设置初始文字,第二次在按钮被点击时重新设置。...额外性能建议 如果你只需要改变一个 span 内部属性,自定义着重号 span 中改变其颜色),你不需要再次调用 TextView.setText ,而只需要调用 invalidate() 或...再次调用 setText 将会在只需要重新 draw 或 measure 时触发不必要业务逻辑并创建不必要对象。

1.5K50
您找到你想要的搜索结果了吗?
是的
没有找到

带着问题去看源码——TextView

RelativeLayout中有一个TextView和一个Button,当点击Button时候给TextView设置文本,这时RelativeLayout重新测量吗?...如果,为什么? 首先我们先大致想一下这个问题问是关于哪一块知识,如果毫不犹豫上去就是一通回答,这样显得太不明智了,我也知道重新测量,为什么?下面我们从源码角度去看。...既然是设置文本,那么我们就从TextViewsetText中去看看吧: TextView: private void setText(CharSequence text, BufferType type...Q2:为什么TextView宽高设置成wrap_content,Activity中获取时候宽度为0,高度不为0? ?...这下面是计算设置drawable和hint宽度,所以我们可以忽略 } 关于宽度我们只需要看这一段就好了,TextView设置wrap_content,走下面的else,然后第一次进来,这个onMeasue

71230

线程与更新UI,细谈原理

方法重新绘制,最终导致崩溃。...,只会调用autoSizeText方法计算文字大小,invalidate绘制文字本身,所以当我们宽高设置为固定值,setText()方法就不会执行到requestLayout()方法了,自然也就执行不到...setText方法中调用TextViewsetText()方法,然后由于Toast中TextView宽高都是wrap_content,所以触发requestLayout方法,最后会调用到最上层...这是我偶然发现三星S9手机上,运行时不会崩溃,而且界面给我反馈并不是修改当前页面上Toast文字,而是像新建了一个Toast展示,即时代码中写setText方法。...所以我猜测部分手机上,应该是改变了Toast设置,当调用setText方法时候,就会马上结束当前Toast展示,调用hide方法。然后再进行Toast文字修改并展示,也就是刚才第三点做法。

79320

TextView自定义下划线、点击弹框

立马会想到使用TextViewfromHtml方法,给添加笔记文本手动加标签,或者使用SpanString类相关方法设置标签。 但是!...要实现以上需求,应该从这几个方面入手: 文本展示,普通文本调用TextViewsetText方法既可,如果是富文本,就使用TextViewfromHtml方法,至于图片如何展示,我在上一篇文章用TextView...TextViewonTouchEvent判断按下位置是否是笔记图标(小圆圈)附近,是的话则弹框(PopupWindow)显示。...03 — 文本显示 这里就不再重复累赘了,文本展示很简单: 调用setText或fromHtml方法既可。 04 — 颜色等属性设置 ?...在上一步绘制小图标时,就将图标的x和y值保存,onTouchEvent中,判断按下位置是否小图标位置“附近”,是的话就弹框显示笔记内容。

1.4K30

Android View之requestLayout排坑

说明可能是某个逻辑导致整个布局进行重绘,而恰巧我们就有个定时器一直更新view,看来极大可能是他导致。        ...那为什么子view更新了自己内容,导致父布局进行布局重计算呢?...再回到前面那个例子,我们并没有直接调用requestLayout,而是调用setText,setBackgroundDrawable这些方法,看来这些方法里面可能也调用了requestLayout从而导致其...而我们前面例子里TextView宽度正是设置为Wrap_Content,同时也没设置mMaxWidth这些影响大小属性,换一句话说,即我们TextView大小是内容自适应,所以每次setText...上面只介绍了setText,setBackgroundDrawable两个方法实现,其实View其他设置方法都大同小异,代码实现者考虑到性能问题,更改View内容时,如果发现其大小等属性没变化,

6K51

Android端IM应用中@人功能实现:仿微博、QQ、微信,零入侵、高可扩展

维护一个Span起始位置管理器SpanRangeManager,然后利用TextWather监听文本变化,文本任何变化都会导致SpanRangeManager重新测算Span位置。...那我们能不能把放在setText()之后设置呢?如果你这么做,你会发现一个新问题。setText()添加文本没有效果。...从Editable getText()源码看,它是super.setText(text, BufferType.EDITABLE)中完成转换。...作用就是标记一个Span无法被拷贝。SpannableStringBuilder构造时候,忽略掉所有NoCopySpan及其子类。...如果有一个View,即使并未attach到Window,我们也可以手动调用measure()、layout()、draw()方法获取一个View截图Drawable用来添加到ImageSpan中使用

2.1K30

TextView实现富文本展示,点击断句和语音播报

方法,传入html代码,最后返回Spanned 对象,使用setText方法既可实现用TextView展示html类型文本。...3、存在问题及优化 这样存在一个问题,我们使用fromHtml加载html文本时,图片是同步加载,而加载网络图片和加载html是异步,也就是说:加载到图片之前,其他文本已经显示到界面上,所以需要我们再次设置...这样导致界面刷新好多次,用户可能刚滑到底部查看内容,这时加载到第一张图片,界面就会立马刷新到最上方,这样用户体验会不会很不好~ 所以,我思路是当所有图片全部加载完成后,再刷新界面,也就是重新setText...这样就好办了, TagHandler中计算img标签个数,ImageGetter中等加载图片个数全部完成时,再次刷新界面(重新调用setText方法)。 ? ?...全部图片加载完成后刷新textview内容(这里setText是稍后会讲到封装设置html代码,大家可简单理解成setText(Html.fromHtml(… )))。

1K10

为什么有时候子线程更新UI没报错?

首先我 onCreate 方法里调用 setText() 方法 override fun onCreate(savedInstanceState: Bundle?)...(TextView.java:4204) at android.widget.TextView.setText(TextView.java:4179) 这应该就是大家熟悉报错了吧,不允许非...那现在捋一下,从上面的错误栈里,可以看到调用流程是: at android.widget.TextView.setText(TextView.java:4347) at android.widget.TextView.checkForRelayout...,因为已经找到了答案,答案就是跟 ViewRootImpl 初始化有关,因为我之前代码是 onCreate() 时候此时去设置textview,此时呢 View 还没被绘制出来,ViewRootImpl...还未创建,创建是 handleResumeActivity() 调用到 windowManager.addView(decorView) 时候。

60151

Android性能优化系列之布局优化

("new Title"); 或者更简单直接查找子控件 TextView titleTextView = (TextView)findViewById(R.id.title_tv) ; titleTextView.setText...我们来分析源码看看吧。对于布局文件解析,最终都会调用到LayoutInflaterinflate方法,该方法最终又会调用rInflate方法,我们看看这个方法。...id设置给根view,因此实际my_foot_layout.xml中RelativeLayoutid变成include标签中id,include不设置id,那么也可以通过relative找到...(1)ImageView缺少src内容 检查Overdraw Overdraw(过度绘制)描述是屏幕某个像素同一帧时间内被绘制了多次。...多层次重叠UI结构里面,如果不可见UI也在做绘制操作,导致某些像素区域被绘制了多次。这样就会浪费大量CPU以及GPU资源。

95020

【Android】Android对于Activity运用以及ViewGroup和 用户界面组件项目中运用

再次启动此活动实例时,将重用现有任务和实例。将调用此实例onNewIntent()方法,将Intent实例传递给此实例。与singleTask一样,系统中同时只有一个这样活动实例。...PhoneWindow是Window子类。在这个PhoneWindow中,有一个DecorView内部类,它是所有应用程序窗口根视图,直接控制是否显示活动(参考旧驱动程序原始单词…)。...:一个牵强比喻:我们可以分别称这三类:画家、画布和用画笔画东西;艺术家用画笔(LayoutInfector.infalte)绘制一个图案,然后画布绘制(addView)!...视图是用户屏幕绘制时可以与之交互对象。ViewGroup是用于存储其他View(和ViewGroup)对象布局容器!...每个ViewGroup都是用于组织子视图不可见容器。其子视图可以是UI绘制区域输入控件或小部件。

65720

自定义ViewPagerStripIndicator

分割线、底部指示器、底部水平边框线都直接在TabIndicator.onDraw()中绘制。 方式很多,这里尽可能使用更少View实现目标。当然标题文本可以不使用TextView自己绘制。...如果需要按下标签时背景切换效果,使用TextView更好些,而且文本换行,大小等也好控 制。...TabIndicator设置 TabIndicator作为一个ViewGroup,需要绘制内容的话就需要设置属性setWillNotDraw(false);以保证onDraw()被执行。...要知道childView绘制覆盖ViewGroup本身内容,所以这里思路是利用paddingBottom为要绘制底部Indicator和BorderLine预留空间。...记得对onViewPagerPageChanged()调用为了不和onPageScrolled()中调用冲突, ViewPager处在SCROLL_STATE_IDLE状态时进行。

88350

TextView

文本控件 显示富文本(URL、不同大小、字体、颜色文本TextView中预定义了一些类似HTML标签(不区分大小写),通过这些标签,我们可以使TextView控件显示不同颜色、大小、字体文字...不能将带有标签字符串直接使用TextView.setText()方法进行设置,需要使用Html.fromHtml()将带有标签字符串转换成CharSequence对象,然后再使用TextView.setText...注意 调用setText方法设置文本完成后,还需要调用 setMovementMethod方法设置一个MovementMethod对象。...---- 总结: 将android:autoLink属性值设置为true,系统自动识别E-mail、电话、网址等特殊文本 使用Html标签,例如 等,不要设置android:autoLink属性...如果insideOVerlay滚动条会在右侧文字显示(覆盖文字一部分)。

1.6K20

Unity基础教程系列(新)(四)——测量性能(MS and FPS)

但是,这是假定性能稳定前提下。实际,帧速率可能在刷新速率倍数之间波动。 是否可以达到目标帧速率取决于处理单个帧需要多长时间。...如果我们启用了动态批处理情况下再次尝试,那么命令结构将保持不变,只是每组10000次Draw被减少为12次Draw动态调用。这是一个显著改进。 ?...(DRP开启GPU instancing) 但第二个光源对于URP似乎没有影响,因为它是一种现代前向渲染器,可一次应用所有光源。因此,即使GPU每次绘制需要执行更多光照计算,命令列表仍保持不变。...FrameRateCounter中新Update方法开始时对其进行检索。 ? 下一步是调整显示文本。我们可以通过使用文本字符串参数调用SetText方法来做到这一点。...(更高精度) 2.7 内存分配 我们帧频计数器已经完成,但是继续之前,我们先检查一下它对性能影响。显示UI需要每帧更多绘制调用,但实际并没有什么不同。

3.6K21

2017年总结笔记整理

其实笔记记多了,反而会懒得去看,时间一久,如果没再次整理一下的话,笔记反而会更乱,当需要时也忘记自己是否曾经记过某个知识点。所以,感觉还是得来梳理一下这个笔记,好,那就开始吧。...pc 连接,那么此时可以考虑通过 wifi,当 pc 和 盒子同一个局域网内时可以通过 adb connect 来连接盒子,当连接失败时才考虑用上面的方法操作后再次调用 adb...即使我们对子控件设置了 layout_marginTop = -10dp,来将子控件往上移到父控件上边界,虽然子控件实际位置确实是往上移了,但是在这个 10dp 区域内是不会绘制,也就是说子控件上面...而 android:clipToPadding 这个属性作用就是允许绘制 padding 内子控件,这个属性默认值是 true,当我们把设置成 false 后,子控件父控件 padding 区域内就可以显示出来了...1.View.post()原理 原文跳转:【Andorid源码解析】View.post() 到底干了啥 Q1: 为什么 View.post() 操作是可以对 UI 进行操作呢,即使子线程中调用

732110

Android VSYNC (Choreographer)与UI刷新原理分析.md

从UI控件内容更改到被重新绘制到屏幕,这中间到底经历了什么?另外,连续两次setTextView到底触发几次UI重绘呢?...在手机上,这个值被调整到60FPS,增加丝滑度,这也是为什么有个(1000/60)16ms指标,一般而言目前Android系统最高FPS也就是60,它是通过了一个VSYNC来保证每16ms最多绘制一帧...UI刷新流程示意 以Textview为例 ,当我们通过setText改变TextView内容后,UI界面不会立刻改变,APP端先向VSYNC服务请求,等到下一次VSYNC信号触发后,APP端UI才真的开始刷新...VSYNC时候,添加一个同步栅栏,防止UI线程中同步消息执行,这样做为了加快VSYNC响应速度,如果不设置,VSYNC到来时候,正在执行一个同步消息,那么UI更新Task就会被延迟执行,这是Android...image.png 等到VSYNC到来后,移除同步栅栏,并率先开始执行当前帧处理,调用逻辑如下 VSYNC回来流程示意 ? image.png doFrame执行UI绘制示意图 ?

1.6K10

Android中多行文本末尾添加图片排版问题解决方法

图片会在TextView右边竖直方向中间位置显示,而不是我们期望最后一行位置显示。...对象 ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); //设置ImageSpan,将其位置设置spannableString...图片确实是放在了最后面,但是英文文本显示出现了凌乱。 原因 实际最后效果是TextView绘制出来,原因当然是TextView绘制咯。...TextViewSpan绘制主要是使用DynamicLayout里面的方法来计算行数, 调用其draw方法(DynamicLayout父类Layout实现)完成绘制。...具体实现如下: //先设置原始文本 text.setText(string); //使用post方法,TextView完成绘制流程后消息队列中被调用 text.post(new Runnable()

2.7K10

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券