標籤:單行 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 解決中英文排版問題