android staticlayout使用讲解,可实现文本绘制换行处理
原帖地址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0915/1682.html
 
 
使用Canvas的drawText繪制文本是不會(huì)自動(dòng)換行的,即使一個(gè)很長(zhǎng)很長(zhǎng)的字符串,drawText也只顯示一行,超出部分被隱藏在屏幕之外。可以逐個(gè)計(jì)算每個(gè)字符的寬度,通過(guò)一定的算法將字符串分割成多個(gè)部分,然后分別調(diào)用drawText一部分一部分的顯示, 但是這種顯示效率會(huì)很低。
StaticLayout是android中處理文字換行的一個(gè)工具類,StaticLayout已經(jīng)實(shí)現(xiàn)了文本繪制換行處理,下面是如何使用StaticLayout的例子:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package com.example.amdroidstaticlayoutdemo; import android.support.v4.app.Fragment; import android.text.Layout.Alignment; import android.text.StaticLayout; import android.text.TextPaint; import android.app.Activity; import android.content.Context; ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.os.Bundle; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.os.Build; public class MainActivity extends Activity { ????@Override ????protected void onCreate(Bundle savedInstanceState) { ????????super.onCreate(savedInstanceState); ????????setContentView(new MyView(this)); ????} ????public class MyView extends View {? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????Paint mPaint; //畫(huà)筆,包含了畫(huà)幾何圖形、文本等的樣式和顏色信息? ????????public MyView(Context context) {? ????????????super(context);???? ????????}? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????public MyView(Context context, AttributeSet attrs){? ????????????super(context, attrs);? ????????}? ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ????????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 = "paint,draw paint指用顏色畫(huà),如油畫(huà)顏料、水彩或者水墨畫(huà),而draw 通常指用鉛筆、鋼筆或者粉筆畫(huà),后者一般并不涂上顏料。兩動(dòng)詞的相應(yīng)名詞分別為p"; ????????????StaticLayout myStaticLayout = new StaticLayout(message, tp, canvas.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); ????????????myStaticLayout.draw(canvas); ????????????canvas.restore(); ????????}? ????}? } | 
這跟TextView的效果是一樣的,其實(shí)TextView也是調(diào)用StaticLayout來(lái)實(shí)現(xiàn)換行的。
StaticLayout的構(gòu)造函數(shù)有三個(gè):
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public StaticLayout(CharSequence source, ????????????????????TextPaint paint, ????????????????????int width, ????????????????????Layout.Alignment align, ????????????????????float spacingmult, ????????????????????float spacingadd, ????????????????????boolean includepad) ???????????????????? public StaticLayout(CharSequence source, ????????????????????int bufstart, ????????????????????int bufend, ????????????????????TextPaint paint, ????????????????????int outerwidth, ????????????????????Layout.Alignment align, ????????????????????float spacingmult, ????????????????????float spacingadd, ????????????????????boolean includepad) ???????????????????? 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) | 
android StaticLayout參數(shù)解釋
 StaticLayout(CharSequence source, int bufstart, int bufend,
 ? ? ? ? ? ?TextPaint paint, int outerwidth,
 ? ? ? ? ? ?Alignment align,
 ? ? ? ? ? ?float spacingmult, float spacingadd,
 ? ? ? ? ? ?boolean includepad,
 ? ? ? ? ? ?TextUtils.TruncateAt ellipsize, int ellipsizedWidth)
 
 
 
1.需要分行的字符串
2.需要分行的字符串從第幾的位置開(kāi)始
3.需要分行的字符串到哪里結(jié)束
4.畫(huà)筆對(duì)象
5.layout的寬度,字符串超出寬度時(shí)自動(dòng)換行。
6.layout的對(duì)其方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三種。
7.相對(duì)行間距,相對(duì)字體大小,1.5f表示行間距為1.5倍的字體高度。
8.在基礎(chǔ)行距上添加多少
實(shí)際行間距等于這兩者的和。
9.參數(shù)未知
10.從什么位置開(kāi)始省略
11.超過(guò)多少開(kāi)始省略
 需要指出的是這個(gè)layout是默認(rèn)畫(huà)在Canvas的(0,0)點(diǎn)的,如果需要調(diào)整位置只能在draw之前移Canvas的起始坐標(biāo)
 canvas.translate(x,y);
總結(jié)
以上是生活随笔為你收集整理的android staticlayout使用讲解,可实现文本绘制换行处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: Android 布局之GridLayou
- 下一篇: Android GestureDetec
