Android中StaticLayout的简单实用

2024-06-14 14:48

本文主要是介绍Android中StaticLayout的简单实用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

StaticLayout在Android中实现自动换行多行文本,通过查看源码可以发现TextView内部也是通过这个类来实现的
父类是:
android.text.Layout
Layout的子类是:
StaticLayout:布局了以后不能进行编辑
DynamicLayout:可以进行编辑
BoringLayout:是一种非常简单的文本布局实现,它适合一行,并且全部是从左到右的字符。

StaticLayout中的构造方法已经不能使用,需要通过StaticLayout.Builder来使用

 

    init{layoutBuilder = StaticLayout.Builder.obtain(text_value, 0, text_value.length, Textpaint(), screenWidth)mStaticlayout = layoutBuilder.build()}override fun onDraw(canvas: Canvas?) {mStaticlayout.draw(canvas)}

在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);}@Overrideprotected 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);}
}
  • 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

运行效果图:

在这里插入图片描述
在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);}
  • 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

以 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);
}说明参数的作用

  1. CharSequence source 需要分行的字符串
  2. int bufstart 需要分行的字符串从第几的位置开始
  3. int bufend 需要分行的字符串到哪里结束
  4. TextPaint paint 画笔对象
  5. int outerwidth layout的宽度,超出时换行
  6. Alignment align layout的对其方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三种
  7. float spacingmult 相对行间距,相对字体大小,1.5f表示行间距为1.5倍的字体高度。
  8. float spacingadd 在基础行距上添加多少
  9. boolean includepad,
  10. TextUtils.TruncateAt ellipsize 从什么位置开始省略
  11. int ellipsizedWidth 超过多少开始省略
    补充:TextView其实也是使用 StaticLayout

这篇关于Android中StaticLayout的简单实用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060702

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口