使用Canvas的drawText繪製文本是不會自動換行的,即便一個很長很長的字符串,drawText也只顯示一行,超出部分被隱藏在屏幕以外。html
那麼TextView這樣的控件是如何處理這個問題的呢?實際上,他會利用一個叫作Layout的輔助類。java
https://developer.android.com/reference/android/text/Layoutandroid
「A base class that manages text layout in visual elements on the screen.」canvas
一個用於管理 text 顯示在屏幕上時視覺效果的類app
Layout是一個虛類,不過仍是提供了一個很是重要的靜態方法ide
float getDesiredWidth (CharSequence source, TextPaint paint)
用於計算source顯示須要多長的寬度。函數
該兩個類都是Layout的子類,不管從構造方法和成員方法上都幾乎同樣,他們的區別咱們在下面介紹,以StaticLayout爲例,咱們來了解下這個東西究竟是用來幹嗎的。工具
StaticLayout是android中處理文字換行的一個工具類,StaticLayout已經實現了文本繪製換行處理,下面是如何使用StaticLayout的例子:字體
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; //畫筆,包含了畫幾何圖形、文本等的樣式和顏色信息 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指用顏色畫,如油畫顏料、水彩或者水墨畫,而draw 一般指用鉛筆、鋼筆或者粉筆畫,後者通常並不塗上顏料。兩動詞的相應名詞分別爲p"; StaticLayout myStaticLayout = new StaticLayout(message, tp, canvas.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); myStaticLayout.draw(canvas); canvas.restore(); } } }
StaticLayout(CharSequence source, int bufstart, int bufend,
TextPaint paint, int outerwidth,
Alignment align,
float spacingmult, float spacingadd,
boolean includepad,
TextUtils.TruncateAt ellipsize, int ellipsizedWidth)ui
1.須要分行的字符串
2.須要分行的字符串從第幾的位置開始
3.須要分行的字符串到哪裏結束
4.畫筆對象
5.layout的寬度,字符串超出寬度時自動換行。
6.layout的對其方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三種。
7.相對行間距,相對字體大小,1.5f表示行間距爲1.5倍的字體高度。
8.在基礎行距上添加多少
實際行間距等於這二者的和。
9.參數未知
10.從什麼位置開始省略
11.超過多少開始省略
固然還有兩個其餘的構造函數,參數意義相同,能夠參看sdkhttps://developer.android.com/reference/android/text/StaticLayout
官方網解釋的是DynamicLayout用於可變字符串,而StaticLayout用於不變的字符串。可是找了DynamicLayout也沒有找到相似updateText這樣的方法用來更新字符串,從新計算長度的。
因而google到這樣一段解釋,我以爲能夠用來參考。
In order to be updated on text change, DynamicLayout expects Spannable as first parameter. In that case it creates instance of internal static class DynamicLayout.ChangeWatcher, and attaches it to the Spannable. The Spannable, in turn, needs to implement Editable in order to be updated.
Example:
SpannableStringBuilder base = new SpannableStringBuilder("a"); DynamicLayout dynamicLayout = new DynamicLayout(base, base, paint, width, Alignment.ALIGN_NORMAL, 1.0, 0, true); int firstHeight = dynamicLayout.getHeight(); base.append("\nA"); int secondHeight = dynamicLayout.getHeight();
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0915/1682.html