Android AutoWrapTextView 解決中英文排版問題

來源:互聯網
上載者:User

標籤:單行   get   wrap   密碼   current   模擬器   定義   qos   paint   

1.概述

最近項目有新需求,UED給了個卡券密碼的UI樣式,

我一看很簡單啊,一個TextView解決問題,然後做好以後在模擬器裡一看.....

納尼,這個時候才想起來,TextView 中英文在一起會有排版問題,那怎麼解決呢......

思路

剛開始的想法是一個字元一個字元的去繪製,繪製到最右邊的臨界點就換行繪製,結果實踐以後發現不同的字元之間的間距不一樣,顯示會非常淩亂,又沒有什麼好的方案解決這個間距問題,所以這個方案pass;

單個字元繪製不行那就一行一行繪製,根據View的長度把文本拆分成N行,然後一行一行的繪製。

2.實現

首先建立一個繼承自View的AutoWrapTextView

init方法裡分別調用了initStyle方法和initPaint方法;

initStyle方法主要解析自訂的屬性

屬性名稱含義都很明顯不用過多解釋,initPaint方法就是初始化一個文本畫筆

接下來我們看看設定文本的方法setText方法

 

首先把文本轉換成Char數組,然後迴圈數組把整個文本拆分成N行文本,下面來看看核心方法splitText方法

 

首先建立一個屬性名稱為mSplitTextList的List集合用來存放拆分的文本;
mSingleTextWidth 為單行文本顯示的寬度;

currentSingleTextWidth 為當前一行累計計算的寬度;

然後開始迴圈Char數組,getSingleCharWidth方法就是計算單個Char的寬度;
如果currentSingleTextWidth 小於 mSingleTextWidth 就把Char添加到lineStringBuffer 當中,如果是最後一個Char就直接把lineStringBuffer添加到mSplitTextList集合當中

如果currentSingleTextWidth 大於 mSingleTextWidth,就把lineStringBuffer添加到mSplitTextList集合當中,重新給lineStringBuffer賦值,currentSingleTextWidth 歸0;

迴圈結束以後拆分好的文本就都添加到mSplitTextList集合當中了。

拆分完成以後迴圈mSplitTextList集合,得到每一行文本的Rect值,繪製文本的時候會用到,然後設定View的寬高。

接下來就是繪製方法drawText

 

 

首先得到第一行文本距離頂部的高度marginTop,然後迴圈文本繪製每一行常值內容。

 

 

我們來看下最後的效果

 

 

至此整個類的邏輯分析就結束了,想看完整源碼的可以移步:

https://github.com/chenpengfei88/AutoWrapTextView

Android AutoWrapTextView 解決中英文排版問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.