StaticLayout的使用详解
16lz
2021-01-26
在Android开发中,Canvas.drawText不会换行,即使一个很长的字符串也只会显示一行,超出部分会隐藏在屏幕之外。
StaticLayout是android中处理文字的一个工具类,StaticLayout 处理了文字换行的问题,如如下示例:
public class StaticLayoutView extends View { StaticLayout staticLayout; public StaticLayoutView(Context context) { this(context, null); } public StaticLayoutView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public StaticLayoutView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); TextPaint textPaint=new TextPaint(Paint.ANTI_ALIAS_FLAG); textPaint.setColor(Color.RED); textPaint.setStyle(Paint.Style.FILL); textPaint.setTextSize(50); String text="在Android开发中,Canvas.drawText不会换行,即使一个很长的字符串也只会显示一行,超出部分会隐藏在屏幕之外.StaticLayout是android中处理文字的一个工具类,StaticLayout 处理了文字换行的问题"; staticLayout=new StaticLayout(text, textPaint, canvas.getWidth(), Layout.Alignment.ALIGN_NORMAL, 1.0f,0.0f , false); staticLayout.draw(canvas); }}
运行效果图:
在Staticlayout的中构造参数有三个:
public StaticLayout(CharSequence source, TextPaint paint, int width, Alignment align, float spacingmult, float spacingadd, boolean includepad) { this(source, 0, source.length(), paint, width, align, spacingmult, spacingadd, includepad); } public StaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, boolean includepad) { this(source, bufstart, bufend, paint, outerwidth, align, spacingmult, spacingadd, includepad, null, 0); } public StaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { this(source, bufstart, bufend, paint, outerwidth, align, TextDirectionHeuristics.FIRSTSTRONG_LTR, spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth, Integer.MAX_VALUE); }
以 public StaticLayout(CharSequence source, int bufstart, int bufend,
TextPaint paint, int outerwidth,
Alignment align,
float spacingmult, float spacingadd,
boolean includepad,
TextUtils.TruncateAt ellipsize, int ellipsizedWidth) {
this(source, bufstart, bufend, paint, outerwidth, align,
TextDirectionHeuristics.FIRSTSTRONG_LTR,
spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth, Integer.MAX_VALUE);
}说明参数的作用
- CharSequence source 需要分行的字符串
- int bufstart 需要分行的字符串从第几的位置开始
- int bufend 需要分行的字符串到哪里结束
- TextPaint paint 画笔对象
- int outerwidth layout的宽度,超出时换行
- Alignment align layout的对其方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三种
- float spacingmult 相对行间距,相对字体大小,1.5f表示行间距为1.5倍的字体高度。
- float spacingadd 在基础行距上添加多少
- boolean includepad,
- TextUtils.TruncateAt ellipsize 从什么位置开始省略
- int ellipsizedWidth 超过多少开始省略
补充:TextView其实也是使用 StaticLayout
更多相关文章
- phonegap+jquerymobile开发android的心得(3)
- 【Android】利用Strings资源文件来格式化字符串
- android提供的TextUtils类
- MPAndroidChart项目实战(四)——柱状图实现及X轴文字不显示问题和
- android开发之获得网络资源
- 【转】使用Intent将图片或文字分享到新浪微博等程序
- android listview(每个item包含图片及文字)
- Android的Socket编程实现
- android java 代码设置 TextView drawableLeft