我爲Android開發了自己的語法高亮庫,效果很好,但問題在於它減慢了打字速度。Android開發:有效的語法高亮技巧?
我試過使用AsyncTask在後臺執行正則表達式,然後應用necassary的顏色,但它仍然放慢了打字過程。
目前,它讀取整個EditText,我想到,而不是獲取文本光標所在的行,獲取該行CharSequence然後在該行上執行正則表達式而不是整個文檔,但我真的不知道我怎麼能得到用戶正在:(行了。
任何想法?
謝謝, 亞歷克斯。
我爲Android開發了自己的語法高亮庫,效果很好,但問題在於它減慢了打字速度。Android開發:有效的語法高亮技巧?
我試過使用AsyncTask在後臺執行正則表達式,然後應用necassary的顏色,但它仍然放慢了打字過程。
目前,它讀取整個EditText,我想到,而不是獲取文本光標所在的行,獲取該行CharSequence然後在該行上執行正則表達式而不是整個文檔,但我真的不知道我怎麼能得到用戶正在:(行了。
任何想法?
謝謝, 亞歷克斯。
除非你只做單行regexn /高亮,你提出的戰略可能無法正常工作,例如,您可能無法確定您是否在多線com中沒有,很好,掃描多條線。 :-)
如果您還沒有這樣做,請使用Traceview來確定特別是減速的位置。這可能是你可以優化足夠的其他東西。例如,也許你正在編譯所有你的對象,而不是靜態地定義它們。
除此之外,我認爲一個典型的模式是隻在用戶暫停時應用語法高亮。實施該的一種可能的方式是:
第1步:在每一個文本的變化(這你大概已經勾搭成),postDelayed()
一個Runnable
並保存SystemClock.uptimeMillis()
檢索的時間戳在EditText
子類的數據成員(或任何你有語法着色邏輯的地方)。爲了這個答案的目的,我會打電話給你的延期,你用postDelayed()
作爲DELAY
。
步驟#2:Runnable
將當前時間從SystemClock.uptimeMillis()
與上次文本更改的時間進行比較。如果時間差小於DELAY
,則知道用戶在此計劃和現在的Runnable
之間鍵入了什麼內容,因此您什麼也不做。但是,如果時間差> = DELAY
,則會運行語法着色邏輯。
這樣,您可以在用戶暫停之前跳過應用語法着色,從而不會中斷他們的輸入。你可以調整DELAY
,或者使其可配置。
順便說一句,你是計劃發佈這個作爲一個開源庫,對吧? :-)
CommonsWare你其實是一個救星!非常感謝,您的回答是解決我的問題的完美方案。我很驚訝沒有語法突出庫的負載,做一個體面的一個很容易。要回答你的問題:以及我正在使用這個庫在我自己的應用程序中使用,所以我不確定。再次,謝謝你! – AlexPriceAP
@AlexPriceAP:「我很驚訝沒有語法高亮庫的加載,做一個體面的庫很容易」 - 是的,但我們都很懶惰......呃,我的意思是......我們想要促進重用。 :-) – CommonsWare
Hehe:P.再次感謝你的幫助。真棒! – AlexPriceAP