Canvas的drawText繪製文字自動換行(支援設定顯示最大行數)
Canvas的drawText繪製文字自動換行(支援設定顯示最大行數)
使用Canvas的drawText繪製文字是不會自動換行的,即使一個很長很長的字串,drawText也只顯示一行,超出部分被隱藏在螢幕之外。可以逐個計算每個字元的寬度,通過一定的演算法將字串分割成多個部分,然後分別呼叫drawText一部分一部分的顯示, 但是這種顯示效率會很低。
StaticLayout是android中處理文字換行的一個工具類,StaticLayout已經實現了文字繪製換行處理
StaticLayout的公開的建構函式有三個
7個引數:
public StaticLayout(CharSequence source,
TextPaint paint,
int width,
Layout.Alignment align,
float spacingmult,
float spacingadd,
boolean includepad)
9個引數:
public StaticLayout(CharSequence source,
int bufstart,
int bufend,
TextPaint paint,
int outerwidth,
Layout.Alignment align,
float spacingmult,
float spacingadd,
boolean includepad)
11個引數:
public StaticLayout(CharSequence source,
int bufstart,
int bufend,
TextPaint paint,
int outerwidth,
Layout.Alignment align,
float spacingmult,
float spacingadd,
boolean includepad,
TextUtils.TruncateAt ellipsize,
int ellipsizedWidth)
以11個引數的構造方法為例,各個引數的意義如下:
1.需要分行的字串 XXXAXXXXBXXX
2.需要分行的字串從第幾的位置開始(如果為A 前面的XXX不顯示)
3.需要分行的字串到哪裡結束(如果為B 後面的XXX不顯示)
4.畫筆物件
5.layout的寬度,字串超出寬度時自動換行。
6.layout的對其方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三種。
7.相對行間距,相對字型大小,1.5f表示行間距為1.5倍的字型高度。
8.在基礎行距上新增多少 實際行間距等於這兩者的和。
9.是否包含padding
10.省略位置的模式 TextUtils.TruncateAt.END、TextUtils.TruncateAt.MARQUEE、TextUtils.TruncateAt.MIDDLE、TextUtils.TruncateAt.START 就是android xml 經常寫的省略模式如下:
android:ellipsize="end" 省略號在結尾
android:ellipsize="start" 省略號在開頭
android:ellipsize="middle" 省略號在中間
android:ellipsize="marquee" 跑馬燈
11.超過多少開始省略
通過檢視原始碼,我們知道,11個引數的構造方法呼叫的是13個引數的構造方法,但是這個方法是@hide 的,我們是沒有呼叫的,外部是無法知道的,但是我們可以通過反射獲取,對反射不熟悉的可以參考這一片文章 你必須掌的握反射用法
我們可以看到最後一個引數,可以設定顯示的最大行數,預設是Integer.MAX_VALUE
也就是說,利用這個可以設定這個屬性
StaticLayout sl = null;
Class clazz = null;
try {
clazz = Class.forName("android.text.StaticLayout");
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
Constructor<?> cons[] = null;
cons = clazz.getConstructors(); //第一步,取得全部構造方法並賦給陣列
Constructor con = null;
StaticLayout tmp = null;
try {
//**13個引數 ,注意int.class 不是interge.class**
con = clazz.getConstructor(CharSequence.class, int.class, int.class, TextPaint.class, int.class,
Layout.Alignment.class, TextDirectionHeuristic.class,float.class, float.class,boolean.class,
TextUtils.TruncateAt.class, int.class, int.class);
} catch (NoSuchMethodException e1) {
e1.printStackTrace();
}
try {
tmp = (StaticLayout) con.newInstance(""+e.label, 0, end, mTextPain, (int)sdif - 1, Layout.Alignment.ALIGN_NORMAL, TextDirectionHeuristics.FIRSTSTRONG_LTR, 1.0f, 0.0f, true, TextUtils.TruncateAt.MIDDLE, (int)(sdif - 3 * sradius),2);
} catch (InstantiationException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (InvocationTargetException e1) {
e1.printStackTrace();
}
sl = tmp;
//StaticLayout sl = new StaticLayout(""+e.label, 0, end, mTextPain, (int)sdif - 1, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true, TextUtils.TruncateAt.MIDDLE, (int)(sdif - 3 * sradius));
//從0,0開始繪製
canvas.translate(scx,scy+sradius+paddingTotal);
sl.draw(canvas);
canvas.restore();//呼叫之前必須canvas.save();
相關文章
- canvas 繪製文字Canvas
- canvas 按住滑鼠拖動 繪製文字Canvas
- canvas 繪製文字詳解Canvas
- canvas 如何自動去換行Canvas
- 通過li-canvas輕鬆實現單圖、多圖、圓角圖繪製,單行文字、多行文字、豎向文字繪製,自動換行,儲存圖片,下載圖片等Canvas
- excel如何設定自動換行?Excel
- html5 canvas學習--繪製文字HTMLCanvas
- 兩個控制顯示格式的函式(自動換行、自動省略) (轉)函式
- canvas實現的按住滑鼠拖動能夠繪製文字效果Canvas
- iOS設定tabbar不顯示文字,只顯示圖片iOStabBar
- 將RichTextBox設定為自動換行或非自動換行 (轉)
- linux vim顯示行號、語法高亮、自動縮排的設定Linux
- 織夢多行文字自定義欄位 支援自動換行
- canvas.drawText淺析Canvas
- 【原】在Matplotlib繪圖過程中設定X軸的刻度和顯示文字繪圖
- canvas核心技術-如何繪製圖片和文字Canvas
- canvas實現手動繪製矩形Canvas
- canvas 繪製旋轉一定角度的矩形Canvas
- canvas 繪製矩形Canvas
- canvas 繪製扇形Canvas
- canvas 繪製的圖片,進行上傳Canvas
- 設定vimrc檔案例如:顯示行號,語法高亮,自動縮排
- canvas繪製動畫的技巧Canvas動畫
- 小程式利用Canvas繪製圖片和豎排文字Canvas
- jquery Banner 圖片自動輪換顯示jQuery
- CSS設定超出指定寬度自動換行CSS
- canvas繪製旋轉一定角度的矩形效果Canvas
- canvas繪製太陽系運動效果Canvas
- Linux下設定終端文字的顯示屬性Linux
- canvas 繪製線條Canvas
- canvas 繪製圓形Canvas
- canvas繪製流星效果Canvas
- canvas繪製直線Canvas
- C# richTextBox滾動到最後一行 顯示最後一行 自動跳轉最後一行C#
- SAP Spartacus unit detail 頁面顯示後自動 focus 設定的原理AI
- ArcPy自動繪製大量地圖並設定地圖要素:Python地圖Python
- canvas繪製不重合的圓Canvas
- ORACLE COL SET 設定顯示引數Oracle