<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android仿微信讀書左右對齊的文字效果

          共 2154字,需瀏覽 5分鐘

           ·

          2021-05-01 21:42

          左右對齊的文字效果,很常見,在大多數(shù)文章上都可以看到,這種效果能給人帶來一種界面整潔的效果,但是如果只是左對齊的話,頁面顯示就會參差不齊;而app的頁面大多數(shù)都是圖形+文字的顯示效果,左右對齊的文字效果需求還是非常大的;而反觀Android的官方控件TextView并沒有提供這種左右對齊的顯示效果,那么就只能自己來造輪子了;

          這里會涉及到實現(xiàn)原理的解析,如果只是需要使用輪子,請拉到最底下;


          1. TextView 效果

          首先,讓我們先來看一下TextView的顯示效果:




          中文情況下還好,但是英文情況下的顯示效果就不是很好看了,右邊會留了很長的空白,對于追求用戶體驗的,這樣的顯示效果肯定是不能滿足的;但是TextView內(nèi)部也沒有提供API給我們,那么就只能自己來實現(xiàn)了;

          2. 對齊原理

          原理:將一行剩余的寬度平分給當(dāng)前單詞的間距,這樣來達到左右對齊的效果;
          那么我們就有兩種實現(xiàn)方案:

          (1)TextView繪制一行的計算原理簡單粗暴,就是計算這一行顯示不下一個單詞的時候,就進行回車換行;TextView已經(jīng)手動給我們計算出了一行能顯示多少的字符,那么我們只需要通過計算剩余的寬度再進行繪制即可;

          會存在問題:如果一行存在單詞較少的情況,就會出現(xiàn)間隔過大的問題;

          比如:



          (2)通過手動計算一行能顯示多少個字符,然后再計算剩余的寬度進行繪制;
          這樣只是比第一步多了個自己計算一行能顯示多少個字符的操作;

          但是這樣也會存在問題:如果單詞存在中英文混合,或者非中文的情況,會很大概率出現(xiàn)換行時單詞被截斷的問題;

          比如:



          3. 最終方案

          以上兩種方案都會存在缺陷,那這樣的話我們就得對出現(xiàn)的問題提出解決方案;

          當(dāng)前市場上有成熟的閱讀軟件,最常用的就是左右對齊的排版效果,來看看當(dāng)前的閱讀軟件是怎么解決這些問題的;

          先看一下微信讀書app的顯示效果:



          再看一下掌閱app的顯示效果:



          微信讀書和掌閱都是對這個過長的單詞進行截斷處理,然后使用“-”符號將這兩個截斷的單詞連接起來,再進行繪制時就不會出現(xiàn)上述兩種方案的問題;

          那么最終方案就是:

          通過手動計算一行能顯示多少個單詞,如果一行最后一個單詞顯示不下,則進行截斷處理,中文則不不存在該問題,這里針對非中文的處理;然后再根據(jù)剩余空間進行繪制;

          那么有了方案之后,接下來看看具體要怎么實現(xiàn);


          4. 最終實現(xiàn)



          (1)先遍歷當(dāng)前頁面的字符,將中英文截取為一個個單詞,具體實現(xiàn)在getWordList(String text)方法里面;通過遍歷當(dāng)前的字符,判斷如果為中文時,則為一個單詞,非中文時則通過遍歷該英文單詞進行拼接,最后拼成一個非中文單詞;

          (2)通過遍歷當(dāng)前的單詞,計算每一行要顯示的單詞集合,具體實現(xiàn)在getLineList(List<String> frontList)這個方法里面;遍歷單詞時,當(dāng)添加最后一個單詞時,寬度已經(jīng)超過一行顯示的距離,那么就判斷最后一個單詞是否為中文,是的話則添加到下一行,否則的話則進行截斷處理;

          (3)通過第二步計算出來的每一行的單詞,計算剩余的距離進行繪制;



          5. 優(yōu)化點


          (1)代碼里修改了繪制的邏輯后,那么關(guān)于TextView的一些基礎(chǔ)屬性也要進行適配;比如布局的方向,可以使用TextView自帶的屬性來進行設(shè)置;通過android:gravity=""和android:textAlignment=""屬性來定義布局的文字方向,是居左還是居右邊,這兩個屬性都可以進行設(shè)置,textAlignment屬性的優(yōu)先級比較高,如果同時設(shè)置的話,那么則以textAlignment屬性為準(zhǔn);

          <com.example.testdemo1.XQJustifyTextView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:textSize="16sp"        android:gravity="start"        android:textAlignment="textStart"/>

          (2)對于實現(xiàn)的英文單詞截斷的效果,還有優(yōu)化的地方,經(jīng)過一些小伙伴的提醒,發(fā)現(xiàn)還可以通過音節(jié)的進行拆分,再去研究了一波微信讀書和掌閱的截斷效果,發(fā)現(xiàn)確實是使用了音節(jié)來進行截斷,這樣展示效果就更加完美了;

          后面研究了一波資料后,發(fā)現(xiàn)可以通過元音來進行截斷,英語單詞的元音有5個,分別是a,e,i,o,u; 那么就可以通過元音加一個輔音的規(guī)則來進行截斷;比如an,en之類的;這里只實現(xiàn)了一種規(guī)則來進行截斷,其他的規(guī)則過于復(fù)雜,暫時沒有引入;

          看一下優(yōu)化后的效果:



          GitHub源碼地址:

          https://github.com/Amterson/AlginProject


          到這里就結(jié)束啦。
          瀏覽 29
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线 中文字幕 日韩 | 琪琪五月色 | 日韩视频专区 | 亚洲免费观看无码爽片视频 | 操逼网国产又大又黄 |