文档章节

android staticlayout使用讲解

丁佳辉
 丁佳辉
发布于 2017/02/07 10:22
字数 657
阅读 7
收藏 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);

© 著作权归作者所有

共有 人打赏支持
丁佳辉
粉丝 19
博文 411
码字总数 196997
作品 0
浦东
程序员
Canvas上drawText的进阶

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

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

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

带梦想一7飞
2013/07/08
0
0
LeadTools Android 入门教学——运行第一个Android Demo

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

葡萄城控件技术团队
2015/03/26
0
0
Android RxJava: 这是一份全面的 操作符 使用汇总 (含详细实例讲解)

前言 ,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 开发者的欢迎。 如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程 如此受欢迎的原...

Carson_Ho
05/31
0
0
Android 性能优化:手把手教你优化Bitmap图片资源的使用

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的Bitmap 使用优化,希望你们会喜欢 目录 1. 优化原因 即 为什么要优化图片资源,具体如下图:

Carson_Ho
04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算卷积神经网络浮点数运算量

前言 本文主要是介绍了,给定一个卷积神经网络的配置之后,如何大概估算它的浮点数运算量。 相关代码:CalFlops,基于MXNet框架的 Scala 接口实现的一个计算MXNet网络模型运算量的demo。 正文...

Ldpe2G
今天
1
0
Sql语言与MySql数据库

1. 数据库简介 1. 数据库,就是存储数据的仓库,只能通过sql语言来访问,数据库也是一个文件系统。通常,MySQL、Oracle等数据库,也被称为关系型数据库,其保存的不仅仅只是数据,还包括数据...

江左煤郎
今天
1
0
IDEA 取消自动import .*

打开设置 > Editor > Code Style > Java > Scheme Default > Imports ① 将 Class count to use import with "*" 改为 99 (导入同一个包的类超过这个数值自动变为 * ) ② 将 Names count ......

乔老哥
今天
3
0
PostGIS学习笔记(开篇)

PostGIS事实上算是笔者开始写博客的第一篇内容。而事实上那篇博文的内容并不丰富,笔者对PostGIS的了解仍然不多,然而17年在OSGeo课程学习时对PostGIS又有了进一步了解,并逐步发现它的强大。...

胖胖雕
今天
3
0
【Centos】在nginx服务器中配置php和mysql

接上一章《【Centos】利用Vultr服务器和namesilo布网》(https://my.oschina.net/u/3776619/blog/2051986),在Centos中配置好nginx,并在iptables中开启了80端口,和为了远程mysql操作方便开...

yongh701
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部