自动换行的矢量文字(android demo)
由于矢量字体的宽度不同,自测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)的更多相关文章
- HTML5火焰文字特效DEMO演示
效果展示:http://hovertree.com/texiao/html5/26/ 效果图: 扫描二维码查看效果:
- HTML5火焰文字特效DEMO演示---转载
只有google支持 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- LeadTools Android 入门教学——运行第一个Android Demo
LeadTools 有很多Windows平台下的Demo,非常全面,但是目前开发手机应用的趋势也越来越明显,LeadTools也给大家提供了10个Android的Demo,这篇文章将会教你如何运行第一 ...
- 【Android】如何快速构建Android Demo
[Android]如何快速构建Android Demo 简介 在 Android 学习的过程中,经常需要针对某些项目来写一些测试的例子,或者在做一些 demo 的时候,都需要先写 Activity 然 ...
- 制作Android Demo GIF:程序演示效果GIF图录制
[转] 制作Android Demo GIF:程序演示效果GIF图录制 在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...
- Ubuntu TensorFlow 源码 Android Demo的编译运行
Ubuntu TensorFlow 源码 Android Demo的编译运行 一. 安装 Android 的SDK和NDK SDK 配置 A:下载 国内下载地址选最新的: SDK: https://d ...
- YOLO2:实时目标检测视频教程,视频演示, Android Demo ,开源教学项目,论文。
实时目标检测和分类 GIF 图: 视频截图: 论文: https://arxiv.org/pdf/1506.02640.pdf https://arxiv.org/pdf/1612.08242.pdf ...
- vs2017 android demo
vs2017自安装以后就没怎么打开过,虽然12出的时候用10,15出的时候用13,17出的时候用15,但我依然坚持不用也装上再说的理念. 1.vs2017开发IOS和Android安装所必不可少的,u ...
- 最全android Demo
1.BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android-cjj/BeautifulRefreshLayout/tree/Beauti ...
随机推荐
- LIB 配置文件读写器
由于读写配置文件的次数比较频繁,而且拥有众多的类库,到最后,直接被各种各样的类库烦死. 顺手封一个简单,实用的.主要功能: 读写AppSetting 读取连接字符串 读取自定义配置节 using Sy ...
- Javascript history pushState onpopstate方法做AJAX SEO
参考MDN: https://developer.mozilla.org/zh-CN/docs/DOM/Manipulating_the_browser_history https://develop ...
- 洛谷 P1008 三连击 Label:水
题目描述 将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数. 输入输出格式 输入格式: 木有输入 输出格式: 若干行,每行3个 ...
- BestCoder Round #78 (div.2)
因为rating不够QAQ就报了Div2.. [CA Loves Stick] CA喜欢玩木棍. 有一天他获得了四根木棍,他想知道用这些木棍能不能拼成一个四边形. Sample Input 2 1 1 ...
- MySql Replication配置
一.前言 Mysql Replication作为读写分离的廉价解决方案,支持一主多备的方式进行数据存储,采用二进制日志传送,目前存在着广泛应用,网上相关概念也比较多,不再重复介绍.引用一张官方提供的R ...
- CentOS Git的还原和操作
$ git log --graph --oneline $ git reset --hard 版本号 用 reflog 挽救错误的重置 [jackluo@localhost demo]$ git re ...
- CentOS 下安装配置mongodb
先从这个地方下载 http://www.mongodb.org/downloads 然后#tar -zxvf mongodb-linux-x86_64-2.4.8.tgz # sudo mv mo ...
- 图解classloader加载class的流程及自定义ClassLoader
图解classloader加载class的流程及自定义ClassLoader 博客分类: JVM JavaJVM虚拟机EXTSUN /** * 转载请注明作者longdick http://l ...
- HDU 1671 Phone List(Trie的应用与内存释放)
Phone List Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【原】Windows下Nexus搭建Maven私服
一.Maven安装 详见Java开发环境搭建 二.Nexus安装 2.1.下载 地址:http://www.sonatype.org/nexus/go/ 选择OSS(ZIP)版本 2.2.安装 将安装 ...