请求一个字符串数组显示的算法
一组字符串数组,里面的有的字符串会超出一屏幕,我判断如果有超出屏幕的字符串把他分成两段,可是显示的时候就会重叠在一起,不知道有什么算法会很好的显示出来呢。
如下:
(原始)
----------------------|
|
撒旦分类萨克据了解啊东|方路甲胺磷
乐山大佛决定了撒 |
萨拉房间里空间拉动积分|垃圾发电萨拉
阿斯利康到访 |
打开了法 |
萨拉;福。建安拉沙德积|分辣椒素代理费
|
|
-----------------------
理想中的
----------------------|
|
撒旦分类萨克据了解啊东|
方路甲胺磷 |
乐山大佛决定了撒 |
萨拉房间里空间拉动积分|
垃圾发电萨拉 |
阿斯利康到访 |
打开了法 |
萨拉;福。建安拉沙德积|
分辣椒素代理费 |
-----------------------
有什么好的算法吗?请指教
[解决办法]
把你的代码贴出来啊,肯定是你在画的时候,位置没有控制好
[解决办法]
不可以设置那个控件的属性吗??
[解决办法]
哈哈哈.容易,应该不难解决.
等我慢慢给你说思路啊.
嘿嘿,解决了把分给我呀.
[解决办法]
http://sf.net/projects/j2me2dgamelib
完全开源的J2me2D游戏开发类库,提供了关于文字显示的完善解决方案
自动根据显示宽度切分字符串,支持随意调整文字颜色,字体,下划线,居中,段落抬头缩进等
[解决办法]
timer时间在跑```可以计算lines的长度,既要显示的行数, 然后计算在timer时间内显示每1行字幕所需要的时间,在timer跑完的时候刚好显示完.
如果要在固定的时间显示固定的字幕,且字幕切割成n段的话,只有加快这n段字幕的显示速度了,
比如要在timer[i]显示lines[k],lines[k+1],先要计算timer[i]所要执行的时间,然后再确定lines[k]+lines[k+1]的显示速度,..遇到这种特殊情况 多写1个方法来处理比较好
[解决办法]
Font类包含了测量给定字体的某个特定字符的大小(尺寸)的方法。当你处理true-type字体的时候,需要知道其字符的宽度是不同的(例如,“W”就比“I”宽)。这就需要使用Font.charWidth()单独测量每个字符。
再得到屏幕的宽度,判断后换行
int width = getWidth();
int lineWidth = 0;
int charWidth = 0;
int y = 10;
int x = 0;
char ch;
for(int ccnt=0; ccnt < data.length; ccnt++)
{
ch = data[ccnt];
//测量要绘制的字符
charWidth = font.charWidth(ch);
lineWidth = lineWidth + charWidth;
//看是否需要新的行
if (lineWidth > width)
{
y = y + fontHeight;
lineWidth = 0;
x = 0;
}
[解决办法]
/**显示字符串,并自动换行,分页,返回页数。
* @param g
* @param str显示内容
* @param page当前显示页
* @param x显示范围
* @param y
* @param w
* @param h
* @param incol内颜色
* @param outcol外颜色
* @return
*/
public byte showPageStrings(Graphics g, String str, int page, int x, int y, int w, int h,int incol,int outcol)
{
char[]chars = str.toCharArray();
int ty = 0;
int idx = 0;
int bx = 2-page*w;
int tx = bx;
int maxpage = 1;
g.setClip(x,y,w,h);
clearScreen(g,Global.BLACK);
while(true)
{
if(chars[idx] == '| '){
idx++;
if(tx > 2){
ty+=Global.fontH;
if(ty > h - Global.fontH){
bx+=w;;
ty = 0;
maxpage++;
}
}
tx = Global.fontW*2;
}else
if(chars[idx] == '& '){
return (byte)maxpage;
}else{
if(tx > = 0 && tx < w){
if(incol != outcol){
g.setColor(outcol);
g.drawChar(chars[idx],x+tx+bx-1,ty+y,0);
g.drawChar(chars[idx],x+tx+bx+1,ty+y,0);
g.drawChar(chars[idx],x+tx+bx,ty+y-1,0);
g.drawChar(chars[idx],x+tx+bx,ty+y+1,0);
}
g.setColor(incol);
g.drawChar(chars[idx],x+tx+bx,ty+y,0);
}
idx++;
tx+=Global.fontW;
}
if(tx + Global.fontW > = w){
tx = 2;
ty+=Global.fontH;
if(ty > h - Global.fontH){
bx+=w;;
ty = 0;
maxpage++;
}
}
}
}
调用方法:
maxPage = showPageStrings(g,
"|游戏中4控制主角向左移动,6控制主角向右移动,2控制主角跳跃,8控制主角蹲下,在面对敌人的时候按5主角可以向地上扔香蕉皮,敌人踩到香蕉皮会滑到,会有一定几率调出炮弹,主角在获得炮弹后,按0可以变为大炮,再按0则变回人形.变成大炮后,可以使用上(2),下(8)键调整攻击范围,按5键可以将炮弹发射出去打倒敌人.& ",
pageFocus
25,30,Global.nWidth - 50,Global.nHeight - 45,
Global.WHITE, Global.BLUE );