由于矢量字体的宽度不同,自测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. Win8怎么查看IP地址

    win8查看自己IP地址方法一:查看本地网络法 1.首先从桌面右下角的“网络连接图标上”点击右键,然后选择打开网络和共享中心,如下图所示: 打开win8网络和共享中心 2.之后在打开的网络和共享中心窗 ...

  2. Codeforces Round #191 (Div. 2) E题

    状态压缩DP,算sum,本来是枚举的,结果TLE了.. #include <iostream> #include <cstring> #include <cstdio&g ...

  3. pygame系列_原创百度随心听音乐播放器_完整版

    程序名:PyMusic 解释:pygame+music 之前发布了自己写的小程序:百度随心听音乐播放器的一些效果图 你可以去到这里再次看看效果: pygame系列_百度随心听_完美的UI设计 这个程序 ...

  4. Js获取当前日期时间及其它格式化操作

    Js获取当前日期时间及其它操作 var myDate = new Date();myDate.getYear();        //获取当前年份(2位)myDate.getFullYear();   ...

  5. 对thinkphp静态模板表单提交的理解

    看表单的提交<form action="{$Think.const.__SELF__}"  method="post">...</form&g ...

  6. Android shell 命令总结

    Package Manage(PM) pm list packages [FILTER] 查看已安装的应用包 -f 显示关联的apk文件 -s 只在系统应用中搜索Filter -3 只在第三方应用中搜 ...

  7. emacs+ensime+sbt打造spark源码阅读环境

    欢迎转载,转载请注明出处,徽沪一郎. 概述 Scala越来越流行, Spark也愈来愈红火, 对spark的代码进行走读也成了一个很普遍的行为.不巧的是,当前java社区中很流行的ide如eclips ...

  8. PHP获取当前时间、时间戳的各种格式写法汇总[日期时间](转)

    今天写下PHP中,如何通过各种方法 获取当前系统时间.时间戳,并备注各种格式的含义,可灵活变通.1.获取当前时间方法date()很简单,这就是获取时间的方法,格式为:date($format, $ti ...

  9. PHP 错误与异常 笔记与总结(11 )register_shutdown_function() 函数的使用

    通过 register_shutdown_function 方法,可以让我们设置一个当执行关闭时可以被调用的另一个函数. 也就是说,当我们的脚本执行完成或者意外死掉导致 php 执行即将关闭时,我们的 ...

  10. Javascript 笔记与总结(1-4)this

    js 中函数的 4 种调用方式: ① 作为普通函数来调用,this 的值指向 window,准确地说,this 为 null,被解释成为 window.在 ECMAScript5 标准中,如果 thi ...