文档章节

android staticlayout使用讲解

丁佳辉
 丁佳辉
发布于 2017/02/07 10:22
字数 657
阅读 9
收藏 0

使用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
博文 412
码字总数 197400
作品 0
浦东
程序员
私信 提问
Canvas上drawText的进阶

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

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

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

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

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

chenyongrenren
2014/10/11
785
0
(JVM)Java虚拟机:类加载的5个过程

前言 了解 类加载的过程,有利于在类初始化时进行一些功能操作 本文全面讲解类加载过程,希望你们会喜欢。 在接下来的日子,我会推出一系列讲解的文章,具体如下;感兴趣可持续关注Carson_Ho...

Carson_Ho
11/06
0
0
LeadTools Android 入门教学——运行第一个Android Demo

LeadTools 有很多Windows平台下的Demo,非常全面,但是目前开发手机应用的趋势也越来越明显,LeadTools也给大家提供了10个Android的Demo,这篇文章将会教你如何运行第一个Android Demo,我想...

葡萄城控件技术团队
2015/03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker搞个wordpress

1.先把wordpress的镜像下载下来 docker pull wordpress 2.下载mysql docker pull mysql:lastest 3.启动mysql docker run --name blog -e root -d mysql:5.7 docker run --name some-mysql -e......

无极之岚
6分钟前
0
0
【宇润日常疯测-005】PHP 中的 clone 和 new 性能比较

clone和new本不应该放在一起比较,它们的作用是不同的。但可能有一些场景下,可以用clone也可以用new,那么这时候我们选哪个呢? 我编写了两个测试,第一个是声明一个空类,第二个是带构造方...

宇润
6分钟前
0
1
点击按钮弹出类似IOS 底部 dialog

implementation 'com.baoyz.actionsheet:library:1.1.7' 然后设置按钮点击监听,,调用下列代码即可 ActionSheet.createBuilder(this, getSupportFragmentManager()) ......

lanyu96
9分钟前
1
0
专访阿里云专有云马劲,一个理性的理想主义者

“我的故事都是和团队技术相关的,自己还真没有什么引人入胜的故事。”当马劲被问到能不能多分享些个人经历故事时他笑着说,我们就干脆怀着好奇聊了聊他和阿里云专有云一路走来的故事。 马劲...

阿里云官方博客
41分钟前
1
0
java环形缓冲区

import java.util.ArrayList;import java.util.List;/** * * 环形缓冲区<br/> * 一. 写数据:<br/> * 1. push: 当数据已写满时返回false,否则可以正常写入返回true<br/>......

whoisliang
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部