【Question】在Fota/UL升级过程中,会出现安装界面,如何在同个软件版本下适配不同手机屏,如FHD/HD 两种不同分辨率屏幕。显然,能在HD屏幕上正常显示大小的界面,当刷入FHD屏的机台中,将出现界面字体及图片均过小问题。
【Solution】
1.准备材料:为解决适配问题,均利用PS等工具将原先适配HD的图片进行放大,保证可以与FHD的适配。
关于更新升级界面的图片及文字资源在src/bootable/recovery/res-xhdpi/images/下:
loop00000.png /*为更新界面的图片*/
installing_text.png /*文字“安装系统更新”*/
progress_empty.png /*空白进度条*/
progress_fill.png /*安装进度条*/
//以上为源码中原生的资源文件,适配于HD,现在需要将这些文件另外拷贝一份利用PS工具放大后并修改下名称:
FHD_loop00000.png /*为更新界面的图片*/
installing_text_fhd.png /*文字“安装系统更新”*/
progress_empty_fhd.png /*空白进度条*/
progress_fill_fhd.png /*安装进度条*/
2.源码路径:src/bootable/recovery/screen_ui.cpp
主要修改内容以patch形式列出如下
diff --git a/src/bootable/recovery/res-xhdpi/images/FHD_loop00000.png b/src/bootable/recovery/res-xhdpi/images/FHD_loop00000.png
new file mode 100755
index 0000000..2c96bb2
Binary files /dev/null and b/src/bootable/recovery/res-xhdpi/images/FHD_loop00000.png differ
diff --git a/src/bootable/recovery/res-xhdpi/images/installing_text_fhd.png b/src/bootable/recovery/res-xhdpi/images/installing_text_fhd.png
new file mode 100755
index 0000000..a76a174
Binary files /dev/null and b/src/bootable/recovery/res-xhdpi/images/installing_text_fhd.png differ
diff --git a/src/bootable/recovery/res-xhdpi/images/progress_empty_fhd.png b/src/bootable/recovery/res-xhdpi/images/progress_empty_fhd.png
new file mode 100755
index 0000000..0c0a651
Binary files /dev/null and b/src/bootable/recovery/res-xhdpi/images/progress_empty_fhd.png differ
diff --git a/src/bootable/recovery/res-xhdpi/images/progress_fill_fhd.png b/src/bootable/recovery/res-xhdpi/images/progress_fill_fhd.png
new file mode 100755
index 0000000..29ff8d3
Binary files /dev/null and b/src/bootable/recovery/res-xhdpi/images/progress_fill_fhd.png differ
diff --git a/src/bootable/recovery/screen_ui.cpp b/src/bootable/recovery/screen_ui.cpp
index 4664f29..3287d73 100755
--- a/src/bootable/recovery/screen_ui.cpp
+++ b/src/bootable/recovery/screen_ui.cpp
@@ -199,6 +199,14 @@ void ScreenRecoveryUI::draw_foreground_locked() {
//int progress_y=608+64+88;
int progress_y=708+64+88;
+ //MODITY CODE++++++ begin
+ char ro_temp_size[15];
+ property_get("ro.temp.size", ro_temp_size,"");
+ if(!strcmp(ro_temp_size,"1080x2160"))
+ {
+ progress_y=1135+64+88;
+ }
+ //MODITY CODE++++++ end
@@ -231,12 +239,22 @@ void ScreenRecoveryUI::draw_foreground_locked() {
char perProgress[5];
int percent = (int)(1.0*pos/width*100);
itoa(percent, perProgress);
- //gr_fill(330, 720, 330+5*char_width_, 720+char_height_ );
- gr_fill(330, 836, 330+5*char_width_, 836+char_height_ );
- gr_color(255, 255, 128, 255);
- // gr_text(330, 720, perProgress, 0);
- gr_text(330, 836, perProgress, 0);
+ //MODITY CODE++++++ begin
+ if(!strcmp(ro_temp_size,"1080x2160"))
+ {
+ gr_fill(490, 1252, 490+5*char_width_, 1252+char_height_ );
+ gr_color(255, 255, 128, 255);
+ gr_text(490, 1252, perProgress, 0);
+ }
+ else{
+ //gr_fill(330, 720, 330+5*char_width_, 720+char_height_ );
+ gr_fill(330, 828, 330+5*char_width_, 828+char_height_ );
+ gr_color(255, 255, 128, 255);
+ // gr_text(330, 720, perProgress, 0);
+ gr_text(330, 828, perProgress, 0);
+ }
+ //MODITY CODE++++++ end
gr_blit(progressBall, 0, 0, ball_width, ball_height, progress_x+pos, progress_y);
@@ -489,10 +507,20 @@ static char** Alloc2d(size_t rows, size_t cols) {
// Choose the right background string to display during update.
void ScreenRecoveryUI::SetSystemUpdateText(bool security_update) {
+ //MODITY CODE++++++ begin
+ char ro_temp_size[15];
+ property_get("ro.temp.size", ro_temp_size,"");
+ //MODITY CODE++++++ end
if (security_update) {
LoadLocalizedBitmap("installing_security_text", &installing_text);
} else {
- LoadLocalizedBitmap("installing_text", &installing_text);
+ //MODITY CODE++++++ begin
+ if(!strcmp(ro_temp_size,"1080x2160")){
+ LoadLocalizedBitmap("installing_text_fhd", &installing_text);
+ }else{
+ LoadLocalizedBitmap("installing_text", &installing_text);
+ }
+ //MODITY CODE++++++ end
}
Redraw();
}
@@ -518,8 +546,17 @@ void ScreenRecoveryUI::Init() {
LoadBitmap("icon_error", &error_icon);
- LoadBitmap("progress_empty", &progressBarEmpty);
- LoadBitmap("progress_fill", &progressBarFill);
+ //MODITY CODE++++++ begin
+ char ro_temp_size[15];
+ property_get("ro.temp.size", ro_temp_size,"");
+ if(!strcmp(ro_temp_size,"1080x2160")){
+ LoadBitmap("progress_empty_fhd", &progressBarEmpty);
+ LoadBitmap("progress_fill_fhd", &progressBarFill);
+ }else{
+ LoadBitmap("progress_empty", &progressBarEmpty);
+ LoadBitmap("progress_fill", &progressBarFill);
+ }
+ //MODITY CODE++++++ end
LoadBitmap("progress_ball", &progressBall);
@@ -545,14 +582,28 @@ void ScreenRecoveryUI::LoadAnimation() {
// How many frames of intro and loop do we have?
std::unique_ptr<DIR, decltype(&closedir)> dir(opendir("/res/images"), closedir);
dirent* de;
+ //MODITY CODE++++++ begin
+ char ro_temp_size[15];
+ property_get("ro.temp.size", ro_temp_size,"");
+ //MODITY CODE++++++ end
while ((de = readdir(dir.get())) != nullptr) {
int value;
- if (sscanf(de->d_name, "intro%d", &value) == 1 && intro_frames < (value + 1)) {
- intro_frames = value + 1;
- } else if (sscanf(de->d_name, "loop%d", &value) == 1 && loop_frames < (value + 1)) {
- loop_frames = value + 1;
+ //MODITY CODE++++++ begin
+ if(!strcmp(ro_temp_size,"1080x2160")){
+ if (sscanf(de->d_name, "intro%d", &value) == 1 && intro_frames < (value + 1)) {
+ intro_frames = value + 1;
+ } else if (sscanf(de->d_name, "FHD_loop%d", &value) == 1 && loop_frames < (value + 1)) {
+ loop_frames = value + 1;
+ }
+ }else{
+ if (sscanf(de->d_name, "intro%d", &value) == 1 && intro_frames < (value + 1)) {
+ intro_frames = value + 1;
+ } else if (sscanf(de->d_name, "loop%d", &value) == 1 && loop_frames < (value + 1)) {
+ loop_frames = value + 1;
+ }
}
+ //MODITY CODE++++++ end
//if (sscanf(de->d_name, "intro%d", &value) == 1 && intro_frames < (value + 1)) {
// intro_frames = value + 1;
//} else if (sscanf(de->d_name, "loop%d", &value) == 1 && loop_frames < (value + 1)) {
@@ -576,8 +627,14 @@ void ScreenRecoveryUI::LoadAnimation() {
for (int i = 0; i < loop_frames; ++i) {
//LoadBitmap(android::base::StringPrintf("loop%05d", i).c_str(), &loopFrames[i]);
- LoadBitmap(android::base::StringPrintf("loop%05d", i).c_str(), &loopFrames[i]);
+ //MODITY CODE++++++ begin
+ if(!strcmp(ro_temp_size,"1080x2160")){
+ LoadBitmap(android::base::StringPrintf("FHD_loop%05d", i).c_str(), &loopFrames[i]);
+ }else{
+ LoadBitmap(android::base::StringPrintf("loop%05d", i).c_str(), &loopFrames[i]);
+ }
+ //MODITY CODE++++++ end
}
}
diff --git a/src/build/core/Makefile b/src/build/core/Makefile
index 194f8e5..8604388 100755
--- a/src/build/core/Makefile
+++ b/src/build/core/Makefile
@@ -1023,10 +1023,14 @@ endif
# can be overridden for a particular device by putting a font.png in
# its private recovery resources.
-ifneq (,$(filter xxxhdpi 560dpi xxhdpi 400dpi xhdpi,$(recovery_density)))
-recovery_font := $(call include-path-for, recovery)/fonts/18x32.png
+ifeq (yes,$(strip $(XXX_DEF_OPTR_XXXX)))
+ recovery_font := $(call include-path-for, recovery)/fonts/18x32.png
else
-recovery_font := $(call include-path-for, recovery)/fonts/12x22.png
+ ifneq (,$(filter xxxhdpi 560dpi xxhdpi 400dpi xhdpi,$(recovery_density)))
+ recovery_font := $(call include-path-for, recovery)/fonts/18x32.png
+ else
+ recovery_font := $(call include-path-for, recovery)/fonts/12x22.png
+ endif
endif
ifndef TARGET_PRIVATE_RES_DIRS
注意查看//MODITY CODE++++++ 部分是修改内容,主要就是对当前屏幕两种不同分辨率适配相应大小的字体及图片。当前分辨率的大小是根据ro.temp.size属性值来判断,当这个ro值等于"1080x2160"时,则判断当前为FHD屏,否则判断为HD屏。(如有定制其他分辨率可以此类推)