Android 使用View繪製文字(DrawText)技術總結

轉載請註明出處: http://www.cnblogs.com/renhui/p/7453534.htmlhtml

這裏的繪製文字不是直接調用TextView.setText(String content)去展現文字內容。而是在View上面經過 canvas.drawText(text, x, y,textPaint) 的方式直接進行文字的繪製。android

1、基本的文字繪製方式

canvas.drawText的方式,須要咱們計算好要繪製的文字的起始位置,並經過移動畫布的來移動到指定的位置,繪製文字完成後而後再復原畫布的位置。canvas

canvas.translate(x, y); // 挪動canvas的座標原點
canvas.drawText(text, x, y, tp);
canvas.translate(-x, -y); // 恢復canvas的座標原點

經過這段代碼,就能夠將文字繪製在指定的位置。編輯器

可是有時候咱們發現,若是須要繪製的內容不少的時候,直接使用 canvas.drawText 存在很大的問題,列舉其中幾個問題以下:函數

  • 只能在一行進行繪製,不會自動換行。
  • 即便內容裏面存在'\n'等換行字符,但是繪製出來的文字仍是在一行裏面,'\n'字符展現出來的效果僅僅是一個空格。
  • 超出屏幕的內容是看不到的。

那麼怎麼處理這個問題呢?Android 的API 裏面 有一個很是棒的工具類 -- StaticLayout。經過StaticLayout,咱們就可以實現了文本繪製換行處理工具

2、使用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)

3、使用StaticLayout的情景

咱們已經知道,使用StaticLayout能夠很好的幫助咱們處理文字繪製時的換行問題,那麼什麼地方咱們可以用到StaticLayout呢?下面我能夠列舉幾個例子:ui

1. 輔助圖文混排的編輯器,生成圖文一體的長圖 -- 須要自定義View繪製的基礎。spa

2. 音樂播放器類,桌面歌詞滾動(可帶顏色)

相關文章
相關標籤/搜索