当前位置: 代码迷 >> 综合 >> 为什么Java Midlet显示的字符串会超出屏幕的边界?。
  详细解决方案

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

热度:10   发布时间:2024-01-19 20:40:26.0
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