为什么Java Midlet显示的字符串会超出屏幕的边界?。

midlet在绘制字符时需要知道何时换行,即特定屏幕宽度下一行能够显示的字符串长度。一般来说midlet会使用两种方法计算。方法一:计算每一个字符的宽度,并相加。例如打印”Hello world”,会分别计算H、e、l、l、o、空格、w、o、r、l、d的宽度,逐个相加,当总宽度超过lcd_width时换行。方法二:直接计算字符串的宽度,当宽度超过lcd_width时换行。例如按顺序计算”H”、”He”、”Hel”、”Hell”、”Hello”等。 
字库中的字符宽度有两类,参照mmi_fe_get_string_info_param_struct。一种是单个字符的宽度pWidth,另一种是单个字符+一小段空隙的宽度adv_w。一般来说adv_w >= pWidth。计算和绘制单个字符宽度时,使用了pWidth,而计算和绘制字符串时宽度使用了adv_w。 
发生这个问题必须满足两个条件。第一,midlet使用第一种方法计算字符串宽度。第二,字库本身adv_w > pWidth。 
解决思路: 
 计算单个字符的宽度时,使用adv_w。 
参考代码: 
1. 在pixcomfontengine.c 添加函数 
void Test_Get_StringWidthHeight_n(U8 *String, S32 n, S32 *pWidth, S32 *pHeight) 

 /*----------------------------------------------------------------*/ 
 /* Local Variables */ 
 /*----------------------------------------------------------------*/ 
 mmi_fe_get_string_info_param_struct query; 
 /*----------------------------------------------------------------*/ 
 /* Code Body */ 
 /*----------------------------------------------------------------*/ 
 memset(&query, 0, sizeof(mmi_fe_get_string_info_param_struct)); 
 query.String = String; 
 query.n = n; 
 query.enableTruncated = MMI_FALSE; 
 query.w = 0; 
 mmi_fe_get_string_widthheight(&query); 
 *pWidth = query.adv_w; 
 *pHeight = query.adv_h; 

2. wgui.c添加函数 
S32 Test_UI_get_string_width_n(UI_string_type text, S32 n) 

 /*----------------------------------------------------------------*/ 
 /* Local Variables */ 
 /*----------------------------------------------------------------*/ 
 S32 w, h; 
 /*----------------------------------------------------------------*/ 
 /* Code Body */ 
 /*----------------------------------------------------------------*/ 
 Test_Get_StringWidthHeight_n((U8*) text, n, &w, &h); 
 return (w); 
}  
3.jui_string_get_width函数中用Test_UI_get_string_width_n取代gui_get_string_width_n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值