我开发了自己的 Android 语法高亮库,效果很好,但问题是它会减慢输入速度。
我试过使用 AsyncTask 在后台执行正则表达式,然后应用必要的颜色,但它仍然减慢了输入过程。
目前,它读取整个 EditText,我想取而代之的是获取文本光标所在的行,获取该行 CharSequence 然后在该行而不是整个文档上执行正则表达式,但我真的不知道如何我可以获得用户正在处理的行 :(。
最佳答案
除非您只进行单行正则表达式/突出显示,否则您建议的策略可能行不通。例如,如果不扫描多行,您可能无法判断自己是否处于多行注释中。 :-)
如果您还没有这样做,请使用 Traceview 确定减速的具体位置。可能是你可以优化足够多的其他东西。例如,您可能正在动态编译所有 Pattern
对象,而不是静态定义它们。
除此之外,我认为典型的模式是仅在用户暂停时应用语法高亮显示。一种可能的实现方式是:
第 1 步:在每次文本更改时(您可能已经 Hook 了),postDelayed()
一个 Runnable
并保存从 SystemClock 检索的时间戳.uptimeMillis()
在你的 EditText
子类的数据成员中(或者任何你有语法着色逻辑的地方)。出于此答案的目的,我将您与 postDelayed()
一起使用的延迟时间称为 DELAY
。
第 2 步:Runnable
将来自 SystemClock.uptimeMillis()
的当前时间与上次文本更改的时间进行比较。如果时间差小于 DELAY
,您就知道用户在安排此 Runnable
和现在之间键入了一些内容,因此您什么都不做。但是,如果时差 >= DELAY
,您将运行语法着色逻辑。
这样,您可以跳过应用语法着色,直到用户暂停,从而不会打断他们的输入。您可以调整 DELAY
,或者使其可配置。
顺便说一句,您计划将其作为开源库发布,对吧? :-)
关于安卓开发 : Efficient Syntax Highlighting Tips?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6794922/