1. 程式人生 > >Android原始碼中關機充電UI的修改

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

     好了,本篇對關機充電介面的修改做了一個簡單例項說明。希望能給大家帶來幫助。