由于矢量字体的宽度不同,自测android字体,发现当中文字体大小为100像素时,字母s等 宽度大概在52,字母l等 宽度大概在26,这样自动换行就不可以按字符的个数计算截取每行显示的字串。

直接上代码。支持\n换行,支持矩形内显示不下的时候,把最后显示的字符换成...

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View; public class MyView extends View { private Paint paint; public MyView(Context context) {
super(context);
paint = new Paint();
} protected void onDraw(Canvas canvas) {
String s = "kkkkkkkkkkkkkllllllllllllllll阿三空间的了看见拉是假的了解拉萨空间的路径去我而刻录机自行车刻录机是的了次幂,你,吉林省地方pitqwer 省电费撒在西昌采访"; int x = , y = , w = , h = ;
int textSize = ;
paint.setColor(0xff00ff00); canvas.drawRect(x, y, x + w, y + h, paint); long time = System.currentTimeMillis();
drawString2(canvas, s, x, y, w, h, textSize, 0xff000000);
System.out.println("use time " + (System.currentTimeMillis() - time));
} /**
* @param canvas
* @param text
* @param x
* 矩形x
* @param y
* 矩形y
* @param w
* 矩形宽
* @param h
* 矩形高
* @param textSize
* 文字大小(像素)
* @param color
* 文字颜色(argb)
*/
public void drawString2(Canvas canvas, String text, int x, int y, int w,
int h, int textSize, int color) {
paint.setTextSize(textSize);
paint.setColor(color); StringBuffer sb = new StringBuffer();
int maxLine = h / textSize;
int curLine = ;
for (int i = ; i < text.length(); i++) {
char tmp = text.charAt(i);
sb.append(tmp);
if (tmp == '\n') {
curLine++;
canvas.drawText(sb.toString(), x, y + curLine * textSize, paint);
sb = new StringBuffer();
} else if (paint.measureText(sb.toString())
+ getFontW(text.charAt(i == text.length() - ? i : i + )) >= w) {
curLine++;
if (curLine == maxLine && i != text.length() - ) {
sb.replace(sb.length() - , sb.length(), "...");
System.out.println("draw time++");
canvas.drawText(sb.toString(), x, y + curLine * textSize,
paint);
break;
}
System.out.println("line:" + curLine + " all:"
+ getFontW(sb.toString()) + " me:"
+ paint.measureText(sb.toString()));
System.out.println("draw time++");
canvas.drawText(sb.toString(), x, y + curLine * textSize, paint);
sb = new StringBuffer();
} else if (i == text.length() - ) {
System.out.println("draw time++");
canvas.drawText(sb.toString(), x, y + (curLine + ) * textSize,
paint);
}
}
} private float getFontW(char c) {
float[] widths = new float[];
paint.getTextWidths(String.valueOf(c), widths);
return widths[];
} private float getFontW(String s) {
float[] widths = new float[s.length()];
paint.getTextWidths(s, widths);
float sum = ;
for (int i = ; i < widths.length; i++) {
sum += widths[i];
}
return sum;
} }

运行效果:

方法可能还不是很完善,比如字体过大的时候,行尾可能会出现部分空白区域,比如字体大小为50,行尾由于不够绘制下一个文字,空出1~49像素的空白。

效率也应该还可以优化。

整理出来供新手学习,也希望各位能指点指点。

自动换行的矢量文字(android demo)的更多相关文章

  1. HTML5火焰文字特效DEMO演示

    效果展示:http://hovertree.com/texiao/html5/26/ 效果图: 扫描二维码查看效果:

  2. HTML5火焰文字特效DEMO演示---转载

    只有google支持 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  3. LeadTools Android 入门教学——运行第一个Android Demo

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

  4. 【Android】如何快速构建Android Demo

    [Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...

  5. 制作Android Demo GIF:程序演示效果GIF图录制

    [转] 制作Android Demo GIF:程序演示效果GIF图录制   在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...

  6. Ubuntu TensorFlow 源码 Android Demo的编译运行

    Ubuntu TensorFlow 源码 Android Demo的编译运行 一. 安装 Android 的SDK和NDK SDK 配置 A:下载 国内下载地址选最新的: SDK: https://d ...

  7. YOLO2:实时目标检测视频教程,视频演示, Android Demo ,开源教学项目,论文。

    实时目标检测和分类 GIF 图: 视频截图: 论文: https://arxiv.org/pdf/1506.02640.pdf https://arxiv.org/pdf/1612.08242.pdf ...

  8. vs2017 android demo

    vs2017自安装以后就没怎么打开过,虽然12出的时候用10,15出的时候用13,17出的时候用15,但我依然坚持不用也装上再说的理念. 1.vs2017开发IOS和Android安装所必不可少的,u ...

  9. 最全android Demo

    1.BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android-cjj/BeautifulRefreshLayout/tree/Beauti ...

随机推荐

  1. python 代码片段9

    #coding=utf-8 # 字符串指示符号 r表示raw u表示unicode mystring=u'this is unicode!--by' print mystring # 'raw'表示告 ...

  2. shell函数

    1. 定义 : func() { } 或 function func() { } 2.参数 func 1 2 3 4 可在函数中直接调$1来使用,>=10的用${n}

  3. 如何下载某些 flash 在线视频 并使用ffmpeg下载分段并加密的m3u8视频流

    有些网站使用 flash 在线播放视频,不方便进行下载. 可以使用 Chrome 的 Developer Tools 模拟成 iOS 设备(通过修改 User Agent),然后取得 h.264 视频 ...

  4. hdu Rescue

    因为要求的是最少的时间,很明显的是一个利用优先队列的bfs的题目,题目很一般. #include"iostream" #include"algorithm" # ...

  5. iOS - AVAudioPlayer 音频播放

    前言 NS_CLASS_AVAILABLE(10_7, 2_2) @interface AVAudioPlayer : NSObject @available(iOS 2.2, *) public c ...

  6. ondragover 事件规定在何处放置被拖动的数据

    nternet Explorer 9.Firefox.Opera 12.Chrome 以及 Safari 5 支持拖放. 被拖元素,dragElement : 1.添加事件:ondragstart 2 ...

  7. lucene 建立索引的过程

    时间 -- ::  CSDN博客 原文 http://blog.csdn.net/caohaicheng/article/details/ 看lucene主页(http://lucene.apach ...

  8. Powershell变量的类型

    Powershell 默认支持的.NET类型如下:   [order], [pscustomobject], [array], [bool], [byte], [char], [datetime], ...

  9. 网易前端JavaScript编码规范【转】

    1. 变量命名规范 变量名包括全局变量,局部变量,类变量,函数参数等等,他们都属于这一类. 基本规范 变量命名都以类型前缀+有意义的单词组成,单词首字母都需要大写.例如:sUserName,nCoun ...

  10. Javascript 笔记与总结(2-15)结构、样式、行为分离

    [例] <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...