自动换行的矢量文字(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 ...
随机推荐
- Converting Stream to String and back…what are we missing?
string test = "Testing 1-2-3"; // convert string to stream byte[] byteArray = Encoding.ASC ...
- 【python游戏编程之旅】第四篇---pygame中加载位图与常用的数学函数。
本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 在上一篇博客中,我们学习了pygame事件与设备轮询.http://www.cnblogs.com/msxh ...
- BZOJ2874 : 训练士兵
设$a[i][j]$表示$(i,j)$右下角要增加多少 $aj[i][j]=a[i][j]\times j$ $ai[i][j]=a[i][j]\times i$ $aij[i][j]=a[i][j] ...
- 【BZOJ】1015: [JSOI2008]星球大战starwar(并查集)
http://www.lydsy.com/JudgeOnline/problem.php?id=1015 看了题解的囧T_T,一开始以为是求割点,但是想到割点不能统计.... 这题用并查集,思想很巧妙 ...
- HDU 4604 Deque(最长上升子序)
题目链接 本来就对N*log(N)算法不大会....然后各种跪了,求出最长不下降+最长不上升-最少相同元素.求相同元素,用二分求上界搞的.代码里4个二分.... #include <cstdio ...
- Nhibernate Case SUM
SELECT ID END) as nbRowWithValueOf2, END) as nbRowWithValueOf3 FROM Foo GROUP BY ID queryover = quer ...
- javascript 三个 对话框
用法: 一般写在 </html>之后,<script language="javascript">代码必须放在这里面</script> 三个常用 ...
- 使用Hydra扫描网络中存在SSH弱登录密码的Linux系统
1. apt-get install cmake libssl-dev 2. apt-get install hydra (需要图形界面的话用hydra-gtk) 3. hydra -s 22 -v ...
- tomcat从下载到使用
话说,某天正在和周公聊天下大事.被急促的电话铃声召唤回来,所谓江湖救急,于是远程一看.竟然是需要使用tomcat(汤姆家的猫),于是... 下面关于下载和配置tomcat的过程. ①.使用tomcat ...
- JBoss错误
jboss进程在启动时碰到Address already in use: JVM_Bind /0.0.0.0:8080错误. 这个错误的含义是8080端口被占用了. 解决方法: 方法1: 开始--运行 ...