文档章节

android staticlayout使用讲解

丁佳辉
 丁佳辉
发布于 2017/01/07 15:25
字数 657
阅读 228
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

使用Canvas的drawText绘制文本是不会自动换行的,即使一个很长很长的字符串,drawText也只显示一行,超出部分被隐藏在屏幕之外。可以逐个计算每个字符的宽度,通过一定的算法将字符串分割成多个部分,然后分别调用drawText一部分一部分的显示, 但是这种显示效率会很低。

StaticLayout是android中处理文字换行的一个工具类,StaticLayout已经实现了文本绘制换行处理,下面是如何使用StaticLayout的例子:

 
  1. package com.example.amdroidstaticlayoutdemo;
  2. import android.support.v4.app.Fragment;
  3. import android.text.Layout.Alignment;
  4. import android.text.StaticLayout;
  5. import android.text.TextPaint;
  6. import android.app.Activity;
  7. import android.content.Context;
  8.  
  9. import android.graphics.Canvas;
  10. import android.graphics.Color;
  11. import android.graphics.Paint;
  12. import android.graphics.Paint.Style;
  13. import android.os.Bundle;
  14. import android.util.AttributeSet;
  15. import android.view.LayoutInflater;
  16. import android.view.Menu;
  17. import android.view.MenuItem;
  18. import android.view.View;
  19. import android.view.ViewGroup;
  20. import android.widget.TextView;
  21. import android.os.Build;
  22. public class MainActivity extends Activity {
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(new MyView(this));
  27. }
  28. public class MyView extends View {
  29.  
  30. Paint mPaint; //画笔,包含了画几何图形、文本等的样式和颜色信息
  31. public MyView(Context context) {
  32. super(context);
  33. }
  34.  
  35. public MyView(Context context, AttributeSet attrs){
  36. super(context, attrs);
  37. }
  38.  
  39. public void onDraw(Canvas canvas){
  40. super.onDraw(canvas);
  41. TextPaint tp = new TextPaint();
  42. tp.setColor(Color.BLUE);
  43. tp.setStyle(Style.FILL);
  44. tp.setTextSize(50);
  45. String message = "paint,draw paint指用颜色画,如油画颜料、水彩或者水墨画,而draw 通常指用铅笔、钢笔或者粉笔画,后者一般并不涂上颜料。两动词的相应名词分别为p";
  46. StaticLayout myStaticLayout = new StaticLayout(message, tp, canvas.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
  47. myStaticLayout.draw(canvas);
  48. canvas.restore();
  49. }
  50. }
  51. }

 

 

这跟TextView的效果是一样的,其实TextView也是调用StaticLayout来实现换行的。

StaticLayout的构造函数有三个:

 
  1. public StaticLayout(CharSequence source,
  2. TextPaint paint,
  3. int width,
  4. Layout.Alignment align,
  5. float spacingmult,
  6. float spacingadd,
  7. boolean includepad)
  8.  
  9. public StaticLayout(CharSequence source,
  10. int bufstart,
  11. int bufend,
  12. TextPaint paint,
  13. int outerwidth,
  14. Layout.Alignment align,
  15. float spacingmult,
  16. float spacingadd,
  17. boolean includepad)
  18.  
  19. public StaticLayout(CharSequence source,
  20. int bufstart,
  21. int bufend,
  22. TextPaint paint,
  23. int outerwidth,
  24. Layout.Alignment align,
  25. float spacingmult,
  26. float spacingadd,
  27. boolean includepad,
  28. TextUtils.TruncateAt ellipsize,
  29. int ellipsizedWidth)

android StaticLayout参数解释

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.需要分行的字符串到哪里结束

4.画笔对象

5.layout的宽度,字符串超出宽度时自动换行。

6.layout的对其方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三种。

7.相对行间距,相对字体大小,1.5f表示行间距为1.5倍的字体高度。

8.在基础行距上添加多少

实际行间距等于这两者的和。

9.参数未知

10.从什么位置开始省略

11.超过多少开始省略

需要指出的是这个layout是默认画在Canvas的(0,0)点的,如果需要调整位置只能在draw之前移Canvas的起始坐标
canvas.translate(x,y);

© 著作权归作者所有

丁佳辉
粉丝 20
博文 453
码字总数 206507
作品 0
浦东
程序员
私信 提问
Canvas上drawText的进阶

前言 使用Canvas的drawText绘制文本是不会自动换行的,即使一个很长很长的字符串,drawText也只显示一行,超出部分被隐藏在屏幕之外。 那么TextView这样的控件是如何处理这个问题的呢?实际上...

街角的小丑
2018/05/17
345
0
android仿iPhone滚轮控件实现及源码分析(一)

敬告:由于本文代码较多,所以文章分为了一二两篇,如果不便,敬请谅解,可以先下载文章下方的代码,打开参考本文查看,效果更好! 首先,先看下效果图: 这三张图分别是使用滚动控件实现城市...

带梦想一7飞
2013/07/08
540
0
同 android TextView 自动换行之后如果让每行的文本和图片都垂直居中,在这里我使用的textview显示html

院子里一哥们提问的问题 我遇到的相同的情况 同问 在TextView默认的情况下,显示的html如果是图文混排的时候是这种以底部对齐的,但是这样的效果不符合需求,但是看见猿题库这样的软件实现了...

chenyongrenren
2014/10/11
1K
0
这是一份全面 & 详细的Android多线程知识总结指南

前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 今天,我将献上一份全面 & 详细的Android多线程学习指南,希望你们喜欢。 目录 1. 多线程基础知识 在了解Android多线程实现...

Carson_Ho
06/26
0
0
Android:关于多线程的总结知识都在这里了!

前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 今天,我将献上一份全面 & 详细的Android多线程学习指南,希望你们喜欢。 目录

Carson_Ho
05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

003-ES集群

ES 集群 详情: https://my.oschina.net/u/3635512/blog/3140294 将实验机器/etc/elasticsearch/elasticsearch.yml 中配置文件改为 cluster.name: myes   #ES集群名称node.name:......

伟大源于勇敢的开始
36分钟前
8
0
法国电力项目二期正式验收

2019年12月10日, 法国电力项目二期正式验收 并就未来的合作技术方向进行了探讨: 去中心化数据存储/搜索引擎 可信计算/零知识证明 能源虚拟机改造 出席的人有: 法国电力总部 CIO&CTO Step...

怎当她临去时秋波那一转
52分钟前
5
0
谷歌助手

参照: https://www.mxblog.com.cn/mac%E7%89%88chrome%E6%B5%8F%E8%A7%88%E5%99%A8%E5%AE%89%E8%A3%85%E8%B0%B7%E6%AD%8C%E8%AE%BF%E9%97%AE%E5%8A%A9%E6%89%8B.html......

T型人才追梦者
今天
6
0
索引延迟关联

前言 今天在看代码的时候学习到了一种索引的优化,就先在此记录下来。 具体 举个例子,原sql如下: SELECT * FROM TABLE WHERE INDEX = '' LIMIT 10000, 10; 现象 就算INDEX用了查询索引,...

无敌小杰杰
今天
6
0
tomcat_jdk安装,安装zrlog,nginx代理tomcat,第二个java应用

tomcat_jdk安装 要跑tomcat 首先要安装 jdk jdk 有两个版本 一个是 open jdk,一个是 oracle jdk open jdk 是 oracle jdk 的开源版本 两个版本都可以使用 这次实验先使用 open jdk 来做 如果...

doomcat
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部