对于Android源码来讲,不管是Android4.X系统还是Android5.X系统,关机充电的流程是一样的。想从网上找关于修改关机充电UI的知识,发现基本没有,今天有时间就总结一下关于如何修改关机充电的UI界面。

  首先,需要了解一下关机充电的流程:如下图

android 系统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

     好了,本篇对关机充电界面的修改做了一个简单实例说明。希望能给大家带来帮助。