Android原始碼中關機充電UI的修改
對於Android原始碼來講,不管是Android4.X系統還是Android5.X系統,關機充電的流程是一樣的。想從網上找關於修改關機充電UI的知識,發現基本沒有,今天有時間就總結一下關於如何修改關機充電的UI介面。
首先,需要了解一下關機充電的流程:如下圖
看不懂圖沒有關係 我們今天主要是修改上層的UI介面,所以底層的流程有個大概的瞭解就行。
好了,下面我們就在Android原始碼上把關機充電的樣式改為LG手機充電的風格。就那本人之前修改過做一個總結。
一:首先要找到關機充電顯示圖片所在的位置:mediatek/custom/common/lk/logo
在這個目錄下找到你的原始碼工程配置資訊向對應的目錄,我的工程對應的檔案是cu_hd720 ,然後把需要的圖片給替換掉
二.控制 圖片程式碼的地方 mediatek/external/libshowlogo/show_animation_common.c
可以看出來 這是一個.C檔案 那麼如何實現圖片之間相互交替出現呢。
void fill_animation_battery_ver_1(unsigned int capacity, void *fill_addr, void * dec_logo_addr, void * logo_addr, LCM_SCREEN_T phical_screen) { LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity); charging_animation_index++; if (capacity >= 100) { fill_animation_logo(FULL_BATTERY_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen); charging_animation_index = 0; } else if (capacity < 10) {LOG_ANIM("[show_animation_common: %s %d]charging_low_index = %d\n",__FUNCTION__,__LINE__, charging_low_index); fill_animation_logo(LOW_BATTERY_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen); //add by lyj fill_animation_number(NUMBER_PIC_START_0 + capacity, 1, fill_addr, logo_addr, phical_screen); fill_animation_dynamic(NUMBER_PIC_PERCENT,percent_location_rect, fill_addr, percent_pic_addr, logo_addr, phical_screen); if (charging_low_index >= 9) charging_low_index = 0; charging_animation_index = 0; } else { // add by lyj 10-100 if(capacity >= 10 && capacity < 25){ //ONE_BATTERY_INDEX int display = ONE_BATTERY_INDEX; if(next_index == 0 && charging_animation_index > display_time_interval ){ next_index = 1; display = TWO_BATTERY_INDEX; charging_animation_index = 0; }else if(next_index == 1 && charging_animation_index > display_time_interval ){ next_index = 0; charging_animation_index = 0; } fill_animation_logo(display, fill_addr, dec_logo_addr, logo_addr,phical_screen); }else if(capacity >= 25 && capacity < 40){ //TWO_BATTERY_INDEX int display = TWO_BATTERY_INDEX; if(next_index == 0 && charging_animation_index > display_time_interval ){ next_index = 1; display = THREE_BATTERY_INDEX; charging_animation_index = 0; }else if(next_index == 1 && charging_animation_index > display_time_interval ){ next_index = 0; charging_animation_index = 0; } fill_animation_logo(display, fill_addr, dec_logo_addr, logo_addr,phical_screen); }else if(capacity >= 70 && capacity < 80){ // FIVE_BATTERY_INDEX int display = FIVE_BATTERY_INDEX; if(next_index == 0 && charging_animation_index > display_time_interval ){ next_index = 1; display = SIX_BATTERY_INDEX; charging_animation_index = 0; }else if(next_index == 1 && charging_animation_index > display_time_interval ){ next_index = 0; charging_animation_index = 0; } fill_animation_logo(display, fill_addr, dec_logo_addr, logo_addr,phical_screen); } else if(capacity >= 80 && capacity < 90){//80 - 90 //SIX_BATTERY_INDEX int display = SIX_BATTERY_INDEX; if(next_index == 0 && charging_animation_index > display_time_interval ){ next_index = 1; display = FULL_BATTERY_INDEX; charging_animation_index = 0; }else if(next_index == 1 && charging_animation_index > display_time_interval ){ next_index = 0; charging_animation_index = 0; } fill_animation_logo(display, fill_addr, dec_logo_addr, logo_addr,phical_screen); }else{//90-100 FULL_BATTERY_INDEX fill_animation_logo(FULL_BATTERY_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen); charging_animation_index = 0; }//add by lyj fill_animation_number(NUMBER_PIC_START_0 + (capacity/10), 0, fill_addr, logo_addr, phical_screen); fill_animation_number(NUMBER_PIC_START_0 + (capacity%10), 1, fill_addr, logo_addr, phical_screen); fill_animation_dynamic(NUMBER_PIC_PERCENT, percent_location_rect, fill_addr, percent_pic_addr, logo_addr, phical_screen); } }
看一下這個方法我們可以看出,capacity這個變數就是判斷電量的,那麼我們就可以根據電量的多少來控制圖片的顯示。當電量capacity >= 100時 我們執行fill_animation_logo(FULL_BATTERY_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen); 那麼FULL_BATTERY_INDEX是什麼東西呢,我們在這個目錄下看mediatek/custom/common/lk/logo/update 開啟之後發現
#define FULL_BATTERY_INDEX 37 後面的37是什麼意思呢,別急,咱們接著看一下 mediatek/custom/common/lk/logo/update 或者 mediatek/custom/common/lk/logo/rules.mk
./tool/bmp_to_raw ./temp32.raw ./$p/"${p}_bat_10_08".bmp
./tool/bmp_to_raw ./temp33.raw ./$p/"${p}_bat_10_09".bmp
./tool/bmp_to_raw ./temp34.raw ./$p/"${p}_bat_10_10".bmp
./tool/bmp_to_raw ./temp35.raw ./$p/"${p}_bat_bg".bmp
./tool/bmp_to_raw ./temp36.raw ./$p/"${p}_bat_img".bmp
./tool/bmp_to_raw ./temp37.raw ./$p/"${p}_bat_100".bmp
./tool/bmp_to_raw ./boot_logo ./$p/"${p}_kernel".bmp
^_^ 哈哈 /tool/bmp_to_raw ./temp37.raw ./$p/"${p}_bat_100".bmp 看到這之後你是不是就明白了,對!這個就是圖片的名,在cu_hd720目錄下電池滿的圖片的名稱就是cu_hd720_bat_100.bmp 這個就對上號了, 圖片就是這樣轉化的,關機充電所有的圖片都是在mediatek/custom/common/lk/logo/update 或者 mediatek/custom/common/lk/logo/rules.mk目錄下轉化的。
程式碼種if(){
}else if (){}else if (){}.....就是控制圖片的邏輯程式碼。
當然,LG關機充電是不需要控制圖片座標。那麼如果有手機不是這樣的介面,需要控制座標該怎麼處理呢。接著看
三:控制圖片座標的位置:mediatek/custom/common/lk/include/target/cust_diaplay.h
在這個檔案中有許多調整座標的地方,首先你要確定你的手機的解析度,然後找到對應的解析度去修改
// hd720 720*1280
// hd720 720*1280
// battery capacity rectangle ----A
#define CAPACITY_LEFT (266) // battery capacity center
#define CAPACITY_TOP (435)
#define CAPACITY_RIGHT (456)
#define CAPACITY_BOTTOM (705)
// first number rectangle --------B
#define NUMBER_LEFT (290) // number
#define NUMBER_TOP (256)//386
#define NUMBER_RIGHT (335)
#define NUMBER_BOTTOM (320)//450
// % rectangle ----------C
#define PERCENT_LEFT (380) // percent number_left + 2*number_width
#define PERCENT_TOP (256) //386
#define PERCENT_RIGHT (437)
#define PERCENT_BOTTOM (320) //450
// top animation part --------D
#define TOP_ANIMATION_LEFT (278) // top animation
#define TOP_ANIMATION_TOP (100)
#define TOP_ANIMATION_RIGHT (441)
#define TOP_ANIMATION_BOTTOM (129)
// for old animation ----------E
#define BAR_LEFT (313)
#define BAR_TOP (238)
#define BAR_RIGHT (406)
#define BAR_BOTTOM (453)
在這裡做一個簡單的解釋:A組座標是整個電池容量的一個座標 B:顯示電量數字的相對座標 C:%號的相對座標 D和E代表的是頁面顯示動畫圖片的相對座標
其中,TOP是左上角縱座標,LEFT是左上角橫座標,BOTTOM是右下角縱座標,RIGHT是右下角橫座標。,它是一個相對座標,因為在Android中X軸和Y軸的正方向為右和下。,不僅僅是Android ,大部分顯示系統都是按照這個標準來定義座標系的。如此,我們很容易得出電池圖片的高度和寬度。
在來看一下Sumsung的介面顯示控制的程式碼
void fill_animation_battery_ver_1(unsigned int capacity, void *fill_addr, void * dec_logo_addr, void * logo_addr, LCM_SCREEN_T phical_screen)
{
LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
if (capacity >= 100) {
fill_animation_logo(FULL_BATTERY_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen);
} else if (capacity < 10) {
LOG_ANIM("[show_animation_common: %s %d]charging_low_index = %d\n",__FUNCTION__,__LINE__, charging_low_index);
fill_animation_logo(ANIM_V0_BACKGROUND_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen);//low battery
fill_animation_number(NUMBER_PIC_START_0 + capacity, 1, fill_addr, logo_addr, phical_screen);
fill_animation_dynamic(NUMBER_PIC_PERCENT, percent_location_rect, fill_addr, percent_pic_addr, logo_addr, phical_screen);
} else {
unsigned int capacity_grids = 0;
capacity_grids = CAPACITY_BOTTOM - (CAPACITY_BOTTOM - CAPACITY_TOP) * (capacity - 10) / 90;
LOG_ANIM("[show_animation_common: %s %d]capacity_grids : %d,charging_animation_index = %d\n",__FUNCTION__,__LINE__, capacity_grids,charging_animation_index);
fill_animation_logo(ANIM_V1_BACKGROUND_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen);
fill_animation_line(ANIM_LINE_INDEX, capacity_grids, fill_addr, logo_addr, phical_screen);
fill_animation_number(NUMBER_PIC_START_0 + (capacity/10), 0, fill_addr, logo_addr, phical_screen);
fill_animation_number(NUMBER_PIC_START_0 + (capacity%10), 1, fill_addr, logo_addr, phical_screen);
fill_animation_dynamic(NUMBER_PIC_PERCENT, percent_location_rect, fill_addr, percent_pic_addr, logo_addr, phical_screen);//控制%號的顯示
if (capacity <= 90)
{
RECT_REGION_T top_animation_rect = {TOP_ANIMATION_LEFT, capacity_grids - (TOP_ANIMATION_BOTTOM - TOP_ANIMATION_TOP), TOP_ANIMATION_RIGHT, capacity_grids}; // 動畫
fill_animation_dynamic(BAT_ANIM_START_0 + charging_animation_index, top_animation_rect, fill_addr, top_animation_addr, logo_addr, phical_screen);
if (charging_animation_index >= 9) charging_animation_index = 0;
}
}
}
// battery capacity rectangle ----A
#define CAPACITY_LEFT (266) // battery capacity center
#define CAPACITY_TOP (435)
#define CAPACITY_RIGHT (456)
#define CAPACITY_BOTTOM (705)
// first number rectangle --------B
#define NUMBER_LEFT (290) // number
#define NUMBER_TOP (256)//386
#define NUMBER_RIGHT (335)
#define NUMBER_BOTTOM (320)//450
// % rectangle ----------C
#define PERCENT_LEFT (380) // percent number_left + 2*number_width
#define PERCENT_TOP (256) //386
#define PERCENT_RIGHT (437)
#define PERCENT_BOTTOM (320) //450
// top animation part --------D
#define TOP_ANIMATION_LEFT (278) // top animation
#define TOP_ANIMATION_TOP (100)
#define TOP_ANIMATION_RIGHT (441)
#define TOP_ANIMATION_BOTTOM (129)
// for old animation ----------E
#define BAR_LEFT (313)
#define BAR_TOP (238)
#define BAR_RIGHT (406)
#define BAR_BOTTOM (453)
在這裡做一個簡單的解釋:A組座標是整個電池容量的一個座標 B:顯示電量數字的相對座標 C:%號的相對座標 D和E代表的是頁面顯示動畫圖片的相對座標
其中,TOP是左上角縱座標,LEFT是左上角橫座標,BOTTOM是右下角縱座標,RIGHT是右下角橫座標。,它是一個相對座標,因為在Android中X軸和Y軸的正方向為右和下。,不僅僅是Android ,大部分顯示系統都是按照這個標準來定義座標系的。如此,我們很容易得出電池圖片的高度和寬度。
在來看一下Sumsung的介面顯示控制的程式碼
void fill_animation_battery_ver_1(unsigned int capacity, void *fill_addr, void * dec_logo_addr, void * logo_addr, LCM_SCREEN_T phical_screen)
{
LOG_ANIM("[show_animation_common: %s %d]capacity : %d\n",__FUNCTION__,__LINE__, capacity);
if (capacity >= 100) {
fill_animation_logo(FULL_BATTERY_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen);
} else if (capacity < 10) {
LOG_ANIM("[show_animation_common: %s %d]charging_low_index = %d\n",__FUNCTION__,__LINE__, charging_low_index);
fill_animation_logo(ANIM_V0_BACKGROUND_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen);//low battery
fill_animation_number(NUMBER_PIC_START_0 + capacity, 1, fill_addr, logo_addr, phical_screen);
fill_animation_dynamic(NUMBER_PIC_PERCENT, percent_location_rect, fill_addr, percent_pic_addr, logo_addr, phical_screen);
} else {
unsigned int capacity_grids = 0;
capacity_grids = CAPACITY_BOTTOM - (CAPACITY_BOTTOM - CAPACITY_TOP) * (capacity - 10) / 90;
LOG_ANIM("[show_animation_common: %s %d]capacity_grids : %d,charging_animation_index = %d\n",__FUNCTION__,__LINE__, capacity_grids,charging_animation_index);
fill_animation_logo(ANIM_V1_BACKGROUND_INDEX, fill_addr, dec_logo_addr, logo_addr,phical_screen);
fill_animation_line(ANIM_LINE_INDEX, capacity_grids, fill_addr, logo_addr, phical_screen);
fill_animation_number(NUMBER_PIC_START_0 + (capacity/10), 0, fill_addr, logo_addr, phical_screen);
fill_animation_number(NUMBER_PIC_START_0 + (capacity%10), 1, fill_addr, logo_addr, phical_screen);
fill_animation_dynamic(NUMBER_PIC_PERCENT, percent_location_rect, fill_addr, percent_pic_addr, logo_addr, phical_screen);//控制%號的顯示
if (capacity <= 90)
{
RECT_REGION_T top_animation_rect = {TOP_ANIMATION_LEFT, capacity_grids - (TOP_ANIMATION_BOTTOM - TOP_ANIMATION_TOP), TOP_ANIMATION_RIGHT, capacity_grids}; // 動畫
fill_animation_dynamic(BAT_ANIM_START_0 + charging_animation_index, top_animation_rect, fill_addr, top_animation_addr, logo_addr, phical_screen);
if (charging_animation_index >= 9) charging_animation_index = 0;
}
}
}
程式碼很清晰,不用做過多的解釋。
我們現在所做的都是在Android原始碼已有的圖片上進行的修改,那麼現在要是新增一些圖片怎麼辦?接著看
四:圖片的新增
1:首先把需要的圖片放在對應的資原始檔下
2:然後在mediatek/custom/common/lk/logo/update 和 mediatek/custom/common/lk/logo/rules.mk目錄圖片進行註冊
這裡需要注意的是:註冊是有先後順序的,一定要把註冊的 圖片放在最後。在rules.mk常規註冊一下就行了。在/update中
要在./tool/bmp_to_raw 和./tool/zpipe -l 9 以及rm -rf ./temp0.raw都需要註冊
3:在控制程式碼的show_animation_common.c檔案中控制圖片即可。
以上是在Android4.X基礎上做的。Android5.X只有包括檔案的路徑,程式碼的控制有多改變,但是修改的流程是和Android4.X是一樣的。下面就對Android5.X相對應的路徑做一下說明
關機充電圖片的路徑:/bootable/bootloader/lk/dev/logo
控制圖片程式碼的路徑:/vendor/mediatek/proprietary/external/libshowlogo/show_animation_common.c
控制圖片座標的路徑:/vendor/mediatek/proprietary/external/libshowlogo/cust_display.h
圖片註冊的路徑: /vendor/mediatek/proprietary/external/libshowlogo/rules.mk
/vendor/mediatek/proprietary/external/libshowlogo/update
好了,本篇對關機充電介面的修改做了一個簡單例項說明。希望能給大家帶來幫助。