Android中用StaticLayout實(shí)現(xiàn)文本繪制自動(dòng)換行詳解
前言
使用Canvas的drawText繪制文本是不會(huì)自動(dòng)換行的,即使一個(gè)很長很長的字符串,drawText也只顯示一行,超出部分被隱藏在屏幕之外??梢灾饌€(gè)計(jì)算每個(gè)字符的寬度,通過一定的算法將字符串分割成多個(gè)部分,然后分別調(diào)用drawText一部分一部分的顯示, 但是這種顯示效率會(huì)很低。
StaticLayout是android中處理文字換行的一個(gè)工具類, StaticLayout 已經(jīng)實(shí)現(xiàn)了文本繪制換行處理,下面是如何使用 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 通常指用鉛筆、鋼筆或者粉筆畫,后者一般并不涂上顏料。兩動(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 來實(shí)現(xiàn)換行的。
StaticLayout的構(gòu)造函數(shù)有三個(gè):
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.需要分行的字符串從第幾的位置開始
3.需要分行的字符串到哪里結(jié)束
4.畫筆對象
5.layout的寬度,字符串超出寬度時(shí)自動(dòng)換行。
6.layout的對其方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三種。
7.相對行間距,相對字體大小,1.5f表示行間距為1.5倍的字體高度。
8.在基礎(chǔ)行距上添加多少
實(shí)際行間距等于這兩者的和。
9.參數(shù)未知
10.從什么位置開始省略
11.超過多少開始省略
需要指出的是這個(gè)layout是默認(rèn)畫在Canvas的(0,0)點(diǎn)的,如果需要調(diào)整位置只能在draw之前移Canvas的起始坐標(biāo)
canvas.translate(x,y);
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android 屬性動(dòng)畫ValueAnimator與插值器詳解
這篇文章主要介紹了Android 屬性動(dòng)畫ValueAnimator與插值器詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
基于Android的英文詞典的實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了基于Android的英文詞典的實(shí)現(xiàn)方法2016-05-05
Android開發(fā)中模仿qq列表信息滑動(dòng)刪除功能
這篇文章主要介紹了Android開發(fā)中模仿qq列表信息滑動(dòng)刪除功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01
Flutter 底部彈窗ModelBottomSheet的使用示例
在實(shí)際開發(fā)過程中,經(jīng)常會(huì)用到底部彈窗來進(jìn)行快捷操作,例如選擇一個(gè)選項(xiàng),選擇下一步操作等等。在 Flutter 中提供了一個(gè) showModelBottomSheet 方法用于彈出底部彈窗,本篇介紹如何使用底部彈窗。2021-06-06
靈活使用Android中ActionBar和ViewPager切換頁面
這篇文章主要介紹了如何靈活使用Android中ActionBar和ViewPager切換頁面,感興趣的小伙伴們可以參考一下2015-12-12
Android BroadcastReceiver接收收到短信的廣播
這篇文章主要為大家詳細(xì)介紹了Android BroadcastReceiver接收收到短信的廣播,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android開發(fā)App啟動(dòng)流程與消息機(jī)制詳解
這篇文章主要為大家介紹了Android開發(fā)App啟動(dòng)流程與消息機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08

