轉載請註明出處: http://www.cnblogs.com/renhui/p/7453534.htmlhtml
這裏的繪製文字不是直接調用TextView.setText(String content)去展現文字內容。而是在View上面經過 canvas.drawText(text, x, y,textPaint) 的方式直接進行文字的繪製。android
canvas.drawText的方式,須要咱們計算好要繪製的文字的起始位置,並經過移動畫布的來移動到指定的位置,繪製文字完成後而後再復原畫布的位置。canvas
canvas.translate(x, y); // 挪動canvas的座標原點 canvas.drawText(text, x, y, tp); canvas.translate(-x, -y); // 恢復canvas的座標原點
經過這段代碼,就能夠將文字繪製在指定的位置。編輯器
可是有時候咱們發現,若是須要繪製的內容不少的時候,直接使用 canvas.drawText 存在很大的問題,列舉其中幾個問題以下:函數
那麼怎麼處理這個問題呢?Android 的API 裏面 有一個很是棒的工具類 -- StaticLayout。經過StaticLayout,咱們就可以實現了文本繪製換行處理工具
public void onDraw(Canvas canvas){ super.onDraw(canvas); TextPaint tp = new TextPaint(); tp.setColor(Color.BLUE); tp.setStyle(Style.FILL); tp.setTextSize(50); String message = "8月30日中午,法制晚報·見解新聞記者從中國電信、中國聯通、中國移動獲悉,三大運營商將從9月1日起全面取消手機國內長途費和漫遊費(不含港澳臺,下同),比原計劃的10月1日提早一個月完成。用戶無需申請,自動生效。"; StaticLayout myStaticLayout = new StaticLayout(message, tp, canvas.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); myStaticLayout.draw(canvas); canvas.restore(); }
上面這段代碼就是使用StaticLayout繪製文本的基本使用方式。運行後發現跟TextView的效果是同樣的,經過閱讀android源碼能夠發現,其實TextView也是調用StaticLayout來實現換行的。字體
StaticLayout的構造函數有三個:動畫
public StaticLayout(CharSequence source, // 須要分行的字符串 TextPaint paint, // 畫筆對象 int width, // layout的寬度,字符串超出寬度時自動換行 Layout.Alignment align, // 對齊方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三種 float spacingmult, // 相對行間距,相對字體大小,1.5f表示行間距爲1.5倍的字體高度。 float spacingadd, // 在基礎行距上添加多少(實際行間距等於二者和) boolean includepad)
public StaticLayout(CharSequence source, // 須要分行的字符串 int bufstart, // 須要分行的字符串從第幾位開始 int bufend, // 須要分行的字符串到哪裏結束 TextPaint paint, // 畫筆對象 int outerwidth, // layout的寬度,字符串超出寬度時自動換行 Layout.Alignment align, // 對齊方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三種 float spacingmult, // 相對行間距,相對字體大小,1.5f表示行間距爲1.5倍的字體高度。 float spacingadd, // 在基礎行距上添加多少 boolean includepad)
public StaticLayout(CharSequence source, // 須要分行的字符串 int bufstart, // 須要分行的字符串從第幾位開始 int bufend, // 須要分行的字符串到哪裏結束 TextPaint paint, // 畫筆對象 int outerwidth, // layout的寬度,字符串超出寬度時自動換行。 Layout.Alignment align, // 對齊方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三種。 float spacingmult, // 相對行間距,相對字體大小,1.5f表示行間距爲1.5倍的字體高度。 float spacingadd, // 在基礎行距上添加多少 boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth)
咱們已經知道,使用StaticLayout能夠很好的幫助咱們處理文字繪製時的換行問題,那麼什麼地方咱們可以用到StaticLayout呢?下面我能夠列舉幾個例子:ui
1. 輔助圖文混排的編輯器,生成圖文一體的長圖 -- 須要自定義View繪製的基礎。spa
2. 音樂播放器類,桌面歌詞滾動(可帶顏色)