【Using English】55 Deep dive in Android Text and Best practices-Part 1

original - medium

Android TextView class is a subclass of View class and is designed to hold and display text. It can be used in the code by importing the package android.widget.TextView. Typically, a TextView isn’t meant for editing. For editing we use EditText.
TextView is most important widgets in while developing android applications.Simply you can not develop any applications without using this.

Android中的TextView類是View的子類帅刊,被設(shè)計用來保持和顯示文本。我們可以在代碼中導(dǎo)入android.widget.TextView來使用它流礁。典型地唠椭,TextView不是用來編輯文本的关筒,在編輯場景我們使用EditText.
開發(fā)Android應(yīng)用程序時,TextView是最重要的控件。沒有它你無法簡單地開發(fā)Android應(yīng)用程序戒洼。


In this series We will discuss following things.

  • TextView Architecture
  • Styling text.
  • Text Layout in View
    In first article we will discuss about TextView Architecture and Styling Text.

這個系列的文章中,我們將討論下面幾件事允华。

  • TextView的架構(gòu)
  • 樣式文本
  • 在View中的文本布局

當(dāng)前文章是第一篇圈浇,這里我討論TextView的架構(gòu)和樣式文本寥掐。


Text Architecture-

Text stack in android is split in two parts, there is java code and there is native or C++ code.
在Android領(lǐng)域內(nèi),文本相關(guān)的技術(shù)椓资瘢可以分為兩個部分召耘,java代碼和native或C++代碼。

1. Java layer - At the top of java layer(as you can see in below diagram) two widgets TextView and EditText is available.For custom view implementation below this layer second layer exists which consist Layout,Paint and Canvas.This layer helps to layout text and render it without using widgets.

1. Java層 - 就像圖標(biāo)中顯示的內(nèi)容一樣褐隆,在Java層的頂端有TextView和EditText這兩個控件可以用污它。對于要實現(xiàn)自定義View的場景,下面的第二層提供了Layout(布局)庶弃,Paint(畫筆)和Canvas(畫布)衫贬。這一層可以不依賴控件就可以布局和渲染文本。

Android Text Architecture

2.Native layer- At the top of native layer Minikin library exists.Minikin helps to do word measurements, line breaking and hyphenation.Below this ICU library exists which deals with unicode, HarfBuzz does text shaping, FreeType for conversion of Gifs to bitmaps, Skia which is graphics engine.
2.Native 層- native層的最頂端是Minikin庫歇攻。Minikin可以用來測量詞匯固惯,換行和斷字。下面是ICU庫缴守,用來處理編碼問題缝呕;在下面是HarfBuzz庫,用來做文本塑造斧散;再下面是FreeType供常,用來做動態(tài)圖到位圖的變換;在下面是Skia庫鸡捐,是圖像引擎栈暇。

Minikin-It lies at the core of android stack and is implemented in c++.It’s main responsibilities are text layout measurement and line breaking.
Minkin是Android技術(shù)棧的重要部分,由C++實現(xiàn)箍镜。它的主要職責(zé)是文本布局的測量以及斷行(邏輯上源祈,測量與斷行是強相關(guān)的)。

**i).Text Measurement****-Minikin took string as parameter and identify the glyphs(Glyph is a representation of character similar to image representation of character).
文本測量色迂,Minikin 把字符串作為參數(shù)并且確認(rèn)他們的字形(就像圖像與字符的對應(yīng)關(guān)系一樣香缺,這里的字形就是字符在圖像上的代表)

Text Measurement

Glyph matching is not necessarily one to one ,it can also be found in different fonts.Once all the glyphs are identified system can position them to have final look.When we provide longer strings minikin first break it into words and for each word it does the measurements the result of measurements is added into a LRU cache called Word Layout cache(It has fixed size of 5k items)so that if system come across same word again so cached value can be used instead of re measurements.
字形的匹配沒有必要一對一,不同的字體可能有不同的字形歇僧。一旦所有的字形都被確定图张,系統(tǒng)會確定好它們的位置來獲得最終的圖像。當(dāng)我們提供了很長的字符串時诈悍,Minikin會先把字符串分隔成很多單詞祸轮,對于每一個單詞做測量的工作,把測量結(jié)果添加到一個叫單詞布局緩存的LRU緩存中(它的容量是確定的5k)侥钳,以便可以讓相同的單詞使用緩存而不是重復(fù)測量适袜。

ii).Line Breaking- When the string is wider than the array in which text to fit in then minikin has to do a line break.
In simple case boxes are put side by side until boundary is reached an then moving to next line.this behaviour can be controlled using break strategy.

斷行:當(dāng)字符串的長度比要填入的數(shù)組大時,Minkin會做一個斷行處理舷夺。簡單地情況是位置會被一個一個填滿苦酱,直到到達邊緣售貌。然后移動到下一行。這個行為可以通過斷行策略來控制疫萤。

Line breaking

In balanced strategy minikin will distribute the words among the lines to have better text alignment. Default value is high quality which is vey similar to balanced except some subtle differences like hyphenation for last line.

在平衡策略中趁矾,為了更好的文本對齊,Minikin把單詞分布在不同的行內(nèi)给僵。默認(rèn)值是高質(zhì)量的毫捣,這一策略與平衡策略類似,除了最后一行的細微斷字帝际。

iii)Hyphenation-Hyphenation improves the alignment of text and use of white space.It arises the measurements costs because now there will be more words to be measured an it has to compare more configuration for optimum solution.

斷字蔓同,斷字會引入文本對齊和空格的運用。這會提升測量的成本蹲诀,因為會有更多需要測量的單詞斑粱,并且,為了最佳的效果還需要對比更多的配置方法脯爪。

Hyphenation

Performance in Android P

Hyphenations is also affected by locale.We have to explicitly set locale for other language string.If string have multiple language then we have to set the multiple locale span which downgrade text layout performance.

斷字也會因為現(xiàn)場而受到影響则北。我們必須明確地設(shè)置不同語言的現(xiàn)場信息。如果字符串中有多重語言痕慢。那么我們不得不設(shè)置多個現(xiàn)場的信息(span愿意為跨度尚揣,但這里說不通吧),這樣會降低文本布局的性能掖举。

Styling Text- 樣式文本

When we want to set multiple style in a text we have to use span.
我們需要使用span來設(shè)置一個文本的多重樣式快骗。

Spans are markup objects that can be attached to text.Spans can be characterised into character and paragraph spans depending on whether they apply to only a few characters or to entire paragraph.
Spans是用修飾文本的標(biāo)記對象。Spans可以修飾字符塔次,也可以修飾段落方篮,這取決于它們被應(yīng)用到幾個字符還是整個段落。

  • Character spans can be split into appearance affecting and metric affecting.
    Appearance affecting(i.e. background color span) requires redraw method of textview to be called while metric affecting(i.e. TypeFace span for font change) requires both remeasure and redraw method to be called because in this case size of text is also changing.
    字符Span可以分為外觀變化和度量變化励负。
    外觀變化(例如背景顏色span)需要調(diào)用TextView的重回方法藕溅;而度量變化(例如字符修改的TypeFace span)需要調(diào)用重新測量重新繪制兩個方法,因為這種情況下文本的尺寸也會被改變继榆。
Spans in TextView Styling
  • Paragraph spans are used to style blocks of text like changing the layout margin or drawing bullets. Bullets span is used to do these things.
    段落的span被用在文本樣式塊中巾表,比如改變布局邊緣空白或繪制項目符號。BulletsSpan就用來做這些事情裕照。

Note:- Comman use case spans are already available in framework and you can still create new Custom span. But you should use Framework span because only these spans can be parceled.
spans常見場景使用框架就可以了攒发。你還可以創(chuàng)建自定義的Span。但是你還是應(yīng)該使用框架層的Span晋南,因為只有這些span可以被序列化。

When we require parcelling of span-
需要實例化span的場景

  • When we pass text via intents. 通過intent(意圖)傳值時
  • When we copy text text is parcelled and then unparcelled via clipboard service.復(fù)制可序列化的文本羔砾,然后通過剪切板服務(wù)來反序列化负间。

How to use span- To use spans two key interface are available spanned and spannable.
Spanned is for immutable markup and immutable text,have declaration of methods like getSpan(),getSpanStart etc.It will allow only query span not modify them.
Spannable is for immutable text and mutable markup. It allow to set and remove span.

如何使用span:可以通過Spanned和Spannable這兩個關(guān)鍵的接口來使用span.
Spanned適用于不可變的修飾和不可變的文本偶妖,有聲明好的方法如getSpan(), getSpanStart 等,只允許查詢span政溃,不允許修改趾访。
Spannable適用于不可變的文本和可變的修飾,允許設(shè)置和移除span董虱。

Span interfaces and classes

Three concrete class implementation of these two interfaces is available as shown in above diagram.
SpannableString hold array of spans whereas SpannableStringBuilder hold tree of spans.
上圖中有三個可用的具體的類扼鞋,這些類實現(xiàn)了上面兩個接口。SpannableString持有span的數(shù)組愤诱,SpannableStringBuilder持有span的樹云头。

Note:- Upto 250 spans performance of SpannableString and Spannable StringBuilder is same but after that SpannbleStringBuilder is faster in rendering.
Note:For checking if one span is present in spannable use Spanned.nextSpanTransition.

注意:span數(shù)到達250的量級,SpannableString與SpannableStringBuilder的性能是相近的淫半,只是SpannableStringBuilder渲染更快一些溃槐。
注意:檢查一個spannable中是否存在一個span,可以使用Spanned.nextSpanTransition方法科吭。

Styling internationalised text-When we use multiple language ,we have multiple string files.In different language same text can be appear in different places so indexing is different for spannable. HTML can we used in string xml but they have limited functionality.

樣式文本的國際化昏滴, 當(dāng)應(yīng)用使用多種語言時,會有多個字符串配置文件对人。在不同的語言中谣殊,相同的文本可能會顯示在不同的位置,所以spannable的檢索方式也是不同的牺弄。我們可以在字符串xml配置文件中使用功能受限制的超文本標(biāo)記語言(HTML)蟹倾。

We should use annotation tags for achieving this.Annotation tags allows to set key and value pairs.
我們應(yīng)該使用注解標(biāo)簽來實現(xiàn)在注解中設(shè)置鍵值對。

Annotation tags in String

To be continued……….
Stay tuned for further articles on this series.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猖闪,一起剝皮案震驚了整個濱河市鲜棠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌培慌,老刑警劉巖豁陆,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吵护,居然都是意外死亡盒音,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門馅而,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祥诽,“玉大人,你說我怎么就攤上這事瓮恭⌒燮海” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵屯蹦,是天一觀的道長维哈。 經(jīng)常有香客問我绳姨,道長,這世上最難降的妖魔是什么阔挠? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任飘庄,我火速辦了婚禮,結(jié)果婚禮上购撼,老公的妹妹穿的比我還像新娘跪削。我一直安慰自己,他們只是感情好迂求,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布碾盐。 她就那樣靜靜地躺著,像睡著了一般锁摔。 火紅的嫁衣襯著肌膚如雪廓旬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天谐腰,我揣著相機與錄音孕豹,去河邊找鬼。 笑死十气,一個胖子當(dāng)著我的面吹牛励背,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播砸西,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼叶眉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芹枷?” 一聲冷哼從身側(cè)響起衅疙,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸳慈,沒想到半個月后饱溢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡走芋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年绩郎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翁逞。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡肋杖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挖函,到底是詐尸還是另有隱情状植,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站浅萧,受9級特大地震影響逐沙,放射性物質(zhì)發(fā)生泄漏哲思。R本人自食惡果不足惜洼畅,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棚赔。 院中可真熱鬧帝簇,春花似錦、人聲如沸靠益。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胧后。三九已至芋浮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壳快,已是汗流浹背纸巷。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留眶痰,地道東北人瘤旨。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像竖伯,于是被迫代替她去往敵國和親存哲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容