混合字符串在CANVAS中的编排显示

转载 2007年09月27日 12:35:00
        所谓混合字符串就是由中英文+各种标点符号+转义字符构成的字符串。我们在J2ME程序中,很多时候由于需要自己控制UI的风格,所以选择使用CANVAS而不使用FORM等高级界面。但在canvas中,长字符串的显示就需要我们自己根据显示的宽度来进行切割显示。而处理混合字符串就是其中比较复杂的情况。

  首先我们要解决的是每行要绘制多少个字符,由于中文字符和英文字符,标点符号的宽度不同。如果我们固定每行显示的字符的个数,那如果中英文,符号混合在一起显示,出来的效果会出现每行显示出来的长度相差比较严重的情况,这样显示的效果不太美观。在处理这个问题上,我们确定每行绘制的最少字符数,因为中文的字宽是最长的,所以我们用显示的宽度除以中文字符的个数就能得到每行的最小字符个数,然后当我们取得最小字符个数后尝试增加后面一个字符,然后和宽度进行比较,如果大于宽度,我们就不添加这个字符,如果小于宽度,我们就继续尝试添加字符,直到大于显示宽度,这样就能保证每行放下最多的字符个数,保证每行都显示比较饱满。

  接下来,我们要处理转义字符的问题。在转义字符上,主要处理/n转义字符。/n的处理主要是两种情况,一种是在每行中发现/n,这样我们就停止当行的截取,进入下一行的截取,这样就实现了换行的目的。还有一种情况就是在我们刚好截取好一行的字符串以后,后面的一个就是/n,如果这种情况,我们要抛掉/n不进行处理。

  这两个功能写在了一个方法中实现,代码如下: 
/** *//**
* 将获得的字符串切割成适合显示的字符串数组
@param text 需要切割的字符串
@param font 使用的字体
@param width 显示的宽读
@return 切割完成的字符串数组
*/

public String[] getSubInfo(String text, Font font, int width) ...{

boolean isFind = false
// 字符最大的宽度
int max_width = font.charWidth(''); 
// 每行放置的最小字符个数
int char_num = width / max_width; 

Vector vector 
= new Vector(); 

while (text.length() > 0...{
int index = text.indexOf(' '); 
int start_num = 0
String info; 
// 剩余的字符串小于每行的字符个数
if (text.length() < char_num) ...{
if (index != -1 && index < text.length()) ...{
info 
= text.substring(start_num, index + 1); 
text 
= text.substring(index + 1); 
vector.addElement(info); 
continue
}

info 
= text.substring(start_num); 
vector.addElement(info); 
break
}

if (index != -1 && index < char_num) ...{
info 
= text.substring(start_num,
start_num 
= (start_num + index + 1)); 
text 
= text.substring(start_num); 
vector.addElement(info); 
continue
}


info 
= text.substring(start_num, start_num = (start_num + char_num)); 
//尝试增加字符个数
while (font.stringWidth((info + text.substring(start_num,
start_num 
+ 1))) < width) ...{
if (index == (start_num + 1)) ...{
start_num 
+= 1
isFind 
= true
break
}

info 
+= text.substring(start_num, start_num = (start_num + 1)); 
if (info.length() >= text.length()) ...{
break
}

}

if (!isFind && (start_num + 1== index) ...{
start_num 
+= 1
}

text 
= text.substring(start_num); 
vector.addElement(info); 
}

String[] text_info 
= new String[vector.size()]; 
vector.copyInto(text_info); 
return text_info; 
}
        关于其他转义字符,如/t,我们可以加上对它的检测,并做相关的转化处理就可以了.

  如果是英语单词在行末的处理这里暂未实现。

Canvas 关于混合模式 PorterDuff.Mode.MULTIPLY(正片叠底)的使用

在做图片处理的时候,特别是两张图片处理的时候,需要把他们重叠在一起,需要显示出不同的重叠效果,PS中有多种图片的处理方式。自己可以尝试的使用一下。...
  • wb175208
  • wb175208
  • 2016年10月22日 17:19
  • 316

Android TextView图文混合编排

实现技术细节不难,两个要点: 1、html代码的混合编写。 2,重写ImageGetter。 例如: 布局: [html] view plain copy ...
  • hzbje7XSXP
  • hzbje7XSXP
  • 2017年03月02日 16:52
  • 73

Android TextView图文混合编排

Android TextView图文混合编排实现技术细节不难,两个要点:1、html代码的混合编写。2,重写ImageGetter。例如:布局: ...
  • zhangphil
  • zhangphil
  • 2016年11月17日 10:40
  • 2700

kubernetes容器编排系统介绍

版权声明:本文由turboxu原创文章,转载请注明出处:  文章原文链接:https://www.qcloud.com/community/article/152 来源:腾云阁 https://ww...
  • qian_xiaoqian
  • qian_xiaoqian
  • 2016年11月07日 18:46
  • 2328

Java 截取中英文混合字符串

题目: 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我...
  • yulei_qq
  • yulei_qq
  • 2015年04月16日 17:28
  • 2003

计算出当前绘制出来的字符串宽度和高度

宽度: 方法1: Paint paint= new Paint();  Rect rect = new Rect(); //返回包围整个字符串的最小的一个Rect区域 paint....
  • miao309410364
  • miao309410364
  • 2015年06月15日 10:49
  • 601

python 中英混合字符串格式对齐所引发的思考

对字符串非中文格式化,我们常用的方式是通过print 方式下的右对齐 n%s(左对齐-n%s)或者ljust\rjust; 但上面存在一个缺点就是对于含有中文字符串的处理是不兼容,导致打印出来格式还是...
  • annulsluo
  • annulsluo
  • 2015年10月31日 17:46
  • 2084

Android中Canvas绘图之PorterDuffXfermode使用及工作原理详解

概述类android.graphics.PorterDuffXfermode继承自android.graphics.Xfermode。在用Android中的Canvas进行绘图时,可以通过使用Port...
  • sunqunsunqun
  • sunqunsunqun
  • 2016年01月11日 00:05
  • 21380

H5:Canvas:字符串,路径,背景,图片

HTML5中新增了画布标签,通过它,可以使用JavaScript在网页中绘制图像。标签在网页中得到的是一个矩形空白区域,可以通过width和height属性来调整其宽和高。创建一个Canvas画布的方...
  • zhs45656
  • zhs45656
  • 2016年08月04日 11:37
  • 1480

关于ubuntu中node-canvas不能显示中文的解决方法

关于ubuntu中node-canvas不能显示中文的解决方法: 比如我用如下方法设置文字内容: var canvas = new Canvas(width,height); var c...
  • sxyizhiren
  • sxyizhiren
  • 2014年03月08日 21:59
  • 2435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:混合字符串在CANVAS中的编排显示
举报原因:
原因补充:

(最多只允许输入30个字)