实现Recovery形式本地化显示文本定制(recovery_l10n工具的使用

Posted 胖子luffy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现Recovery形式本地化显示文本定制(recovery_l10n工具的使用相关的知识,希望对你有一定的参考价值。

一:阅读recovery代码,理清流程

            recovery的多国语言ui的设计代码位于s905\\bootable\\recovery目录下,其中recovery.cpp文件的main函数是其入口。阅读也正是从此次开始。

1.1 main函数流程

只关心recoveryui代码。

1:新建Device对象,Device类封装了ui的相关操作

   

[cpp]  view plain  copy
  1. Device* device = make_device();//新建Device 对象  

 

2:获取RecoveryUI对象

[cpp]  view plain  copy
  1. ui = device->GetUI();//获取RecoveryUI 对象  
  2.     gCurrentUI = ui;  


 

3:设置多国语言使用哪种语言

[cpp]  view plain  copy
  1. ui->SetLocale(locale);  


 

说明:

locale的值为en_GB时表示使用英文

locale的值为zh_CH时表示使用中文

 

为了方便调试,这里可以直接给locale赋值,比如:

[cpp]  view plain  copy
  1. locale = "en_GB";那么,接下来的recovery ui 界面出现的界面图片的文件就是显示英文了。  
  2.   
  3. void ScreenRecoveryUI::SetLocale(const char* new_locale)   
  4.     if (new_locale)   
  5.           this->locale = new_locale;4:初始化ui,这一步的初始化至关重要,包括加载背景图片,文字显示图片以及进度条。  
  6.           ui->Init();  
  7.       
  8. LoadBitmap用于加载背景图和进度条  
  9. LoadLocalizedBitmap加载文字图片  


 

       ui->Init();里面rtl_locale变量是关键,通过判断它来决定加载的是中文还是英文。

rtl_locale的设置:在ui->SetLocale(locale);函数里面

如下:

 

[cpp]  view plain  copy
  1.     char* lang = strdup(locale);  
  2.     for (char* p = lang; *p; ++p)   
  3.         if (*p == '_')   
  4.             *p = '\\0';  
  5.             break;  
  6.           
  7.       
  8.     // A bit cheesy: keep an explicit list of supported languages  
  9.     // that are RTL.  
  10.     if (strcmp(lang, "ar") == 0 ||   // Arabic  
  11.         strcmp(lang, "en") == 0 ||   // Persian (Farsi)  
  12.         strcmp(lang, "fa") == 0 ||   // Persian (Farsi)  
  13.         strcmp(lang, "he") == 0 ||   // Hebrew (new language code)  
  14.         strcmp(lang, "iw") == 0 ||   // Hebrew (old language code)  
  15.         strcmp(lang, "ur") == 0)    // Urdu  
  16.         rtl_locale = true;  
  17.       
  18.     free(lang);  
  19.  else   
  20.     new_locale = NULL;  
  21.   

5:设置初始背景图为空   

[cpp]  view plain  copy
  1. ui->SetBackground(RecoveryUI::NONE);  

 

 

 

6:由于just_exit被初始化为:   bool just_exit = false;因此进入如下代码片段:

[cpp]  view plain  copy
  1. else if (status != INSTALL_SUCCESS || ui->IsTextVisible() || force_stop)   
  2.    <span style="white-space:pre"> </span>ui->ShowText(true);  
  3.  <span style="white-space:pre">   </span>Device::BuiltinAction temp =prompt_and_wait(device, status);  
  4.         if (temp != Device::NO_ACTION) after = temp;  
  5.   


     进入prompt_and_wait函数根据status参数,调用ui->SetBackground函数去更新ui界面,界面显示的文字以及进度条。接下来,最重要的就是ui->SetBackground函数的流程了。


 

1.2 ui->SetBackground函数流程

调用流程

SetBackground

update_screen_locked

draw_screen_locked

draw_background_locked

draw_progress_locked(忽略掉,没用的上)

 

  最终调用的是draw_background_locked来完成背景图以及文字图片的显示;调用draw_progress_locked来更新进度条。

 

1draw_background_locked函数

计算背景图的分辨率iconWidthiconHeight

[cpp]  view plain  copy
  1. <span style="white-space:pre">    </span>gr_surface text_surface = backgroundText[icon];  
  2.         int iconWidth = gr_get_width(surface);  
  3.         int iconHeight = gr_get_height(surface);  


计算背景图xy坐标的偏移值

[cpp]  view plain  copy
  1. iconX = (gr_fb_width() - iconWidth) / 2;  
  2. iconY = (gr_fb_height() - iconHeight) / 2;  


 

计算文字图片的xy坐标的偏移值

[cpp]  view plain  copy
  1. int textX = (gr_fb_width() - textWidth) / 2;  
  2. int textY = ((gr_fb_height() - (iconHeight+textHeight+40+sh)) / 2) +  iconHeight + 40;    
                    

 

调用库函数gr_blit进行图片显示

        

[cpp]  view plain  copy
  1. <span style="white-space:pre">    </span>gr_blit(surface, 0, 0, iconWidth, iconHeight, iconX, iconY);  

 

   调用draw_install_overlay_locked来更新进度条(此次更新了进度   条,可以把draw_progress_locked注释掉)

[cpp]  view plain  copy
  1. if (icon == INSTALLING_UPDATE || icon == ERASING)   
  2.     draw_install_overlay_locked(installingFrame);  
  3.   


调用gr_texticon函数来显示图片文字

[cpp]  view plain  copy
  1. <span style="white-space:pre">    </span>gr_texticon(textX, textY, text_surface);  

 

 

2gr_texticon函数

此函数非常简洁,计算文字显示的X,Y坐标,后面的调试就是调试这里的xy的值

[cpp]  view plain  copy
  1. <span style="white-space:pre">    </span>x += overscan_offset_x ;  
  2. <span style="white-space:pre">    </span>y += overscan_offset_y ;  

最后调用text_blend来显示文字。

 

[java]  view plain  copy
  1. gr_texticon(textX, textY, text_surface);  


 

1.3 小结

经过上面的几个步骤的分析知道,要修改的地方有:

1:背景图片以及文字图片的加载,也就是void ScreenRecoveryUI::Init()函数的修改。

2:设置SetLocale的值,用来表示ui界面显示的是哪一国家的语言文字。可直接赋值,也可以在cache/recovery/last_locale配置好

3:注释调draw_progress_locked函数

4:在gr_texticon函数里面修改文字的坐标




二:背景图片的制作

代码路径:s905\\development\\tools\\recovery_l10n

需要介绍的文件有:要修改的内容也在里面

1s905\\development\\tools\\recovery_l10n\\res\\values-zh-rCN\\strings.xml用于显示中文文字,可以修改里面的中文文字为您所需要的,比如:

原始的内容如下图:


直接讲中文文字修改为如下图:


其中”\\n”表示将在生成的图片中将文字换行。


2s905\\development\\tools\\recovery_l10n\\res\\values\\strings.xml系统默认的英文文字。这里的修改也是直接将该文件的英文修改为您想要的。其中”\\u2026”表示”……”


3s905\\development\\tools\\recovery_l10n\\res\\layout\\main.xml布局文件,用于设置字体的大小,对齐方式。

[html]  如何刷回官方的recovery

android手机用recovery模式怎么调用一下这些?

红米k30pro官方rec怎样卡刷

进入在recovery模式下找不到zip刷机包.怎么办

努比亚z17可不可以不root就刷入第三方rec

下载了zip格式的刷机包,但是在recovery里找不到这个包,怎么办?