[SPRD]展锐Android R关机充电动画修改
关机充电是用minui开发的,代码路径如下
vendor/sprd/proprietories-source/charge
代码中的图片资源路径
vendor/sprd/proprietories-source/charge/images
手机上的图片资源路径
vendor/etc/res/images
项目的屏幕分辨率是540X1200,根据 vendor/sprd/proprietories-source/charge/ui.c
代码中的判断,是 SIZE_720X1280
static int res_pixel_identify(void) {int x = gr_fb_width();int y = gr_fb_height();int size = 0;if((x<= 360) && (y <= 640)){size = SIZE_360X640;}else if((x<=480) && (y<=800)){size = SIZE_480X800;}else if((x<=480) && (y<=854)) {size = SIZE_480X800;LOGD("480 * 854 Use res of 480 * 800\n");}else if((x<=720) && (y<=1280)){size = SIZE_720X1280;}else if((x<=1080) && (y<=1920)){size = SIZE_1080X1920;}else if((x<=1440) && (y<=2560)){size = SIZE_1440X2560;}else{LOGE("Picture size is not standard size\n");}return size;
}
从如下代码中得知,对应电池电量的图片是根据 PROGRESSBAR_INDETERMINATE_STATES 这个值来进行设置的,默认为0%-100%每16.6%为一档7个状态,但要求是20%为一档,我们只需要修改 0-5 档的6个状态的图片资源,并把 PROGRESSBAR_INDETERMINATE_STATES 改为 6 即可
#define PROGRESSBAR_INDETERMINATE_STATES 7
frame = level * (PROGRESSBAR_INDETERMINATE_STATES - 1) / 100;
然后修改电池电量 level 的字体,默认情况下字体是显示在图片的外面的上面,客户要求显示在图片中间,而且默认是用图片显示的,默认代码如下:
#ifdef PICTURE_SHOW_PERCENT_SUPPORTdraw_text_picture(level);
#elsedraw_text_xy((dy + height), (gr_fb_width()/2 - 20), bat);
#endif
首先去掉文件上面定义的宏 PICTURE_SHOW_PERCENT_SUPPORT,让它走 draw_text_xy 去画字体
然后修改 x,y 的坐标居中显示,修改后的代码如下:
#ifdef PICTURE_SHOW_PERCENT_SUPPORTdraw_text_picture(level);
#elsedraw_text_xy((dy + height / 2), (gr_fb_width()/2 - 20), bat);
#endif
修改之后发现字体不见了,找了一下原因原来是先画字体然后画图片导致字体被覆盖了,只需要修改一下图片和字体的顺序即可,修改之后代码如下:
if (gProgressBarType == PROGRESSBAR_TYPE_INDETERMINATE) {gr_blit(gProgressBarIndeterminate[frame], 0, 0, width, height, dx, dy); //画电量的图片frame = (frame + 1);if (frame >= PROGRESSBAR_INDETERMINATE_STATES) {frame = level * (PROGRESSBAR_INDETERMINATE_STATES - 1) / 100;}}
#ifdef PICTURE_SHOW_PERCENT_SUPPORTdraw_text_picture(level);
#elsedraw_text_xy((dy + height / 2), (gr_fb_width()/2 - 20), bat);
#endif
然后修改字体的颜色,修改之后的代码如下
gr_color(0xa4,0xc6,0x39,255); //RGBA,0xa4c639是客户要求的颜色
draw_text_xy((dy + height / 2), (gr_fb_width()/2 - 20), bat);
然后测试之后发现这个字体的坐标是固定坐标,从左边开始画字体,对于0-9是居中的,但是10-100就不是居中的了,需要添加判断level,动态修改字体x的坐标,修改后的代码如下:
gr_color(0xa4,0xc6,0x39,255);
if (level < 10) {draw_text_xy((dy + height / 2), (gr_fb_width()/2 - 20), bat);
} else if (level < 100) {draw_text_xy((dy + height / 2), (gr_fb_width()/2 - 30), bat);
} else {draw_text_xy((dy + height / 2), (gr_fb_width()/2 - 40), bat);
}
然后发现客户对字体也有要求,他们也提供了96x2的图片资源,查看代码发现本身已经支持了这个功能,代码如下:
vendor/sprd/proprietories-source/charge/minui/graphics.c
static void gr_init_font(void) {gr_font = calloc(sizeof(*gr_font), 1);int res = res_create_alpha_surface("font", &(gr_font->texture)); //系统本身会先去找 font.png 这个资源文件,如果没有就用默认的if (res == 0) {// The font image should be a 96x2 array of character images. The// columns are the printable ASCII characters 0x20 - 0x7f. The// top row is regular text; the bottom row is bold.gr_font->cwidth = gr_font->texture->width / 96;gr_font->cheight = gr_font->texture->height / 2;} else {printf("failed to read font: res=%d\n", res);// fall back to the compiled-in font.gr_font->texture = malloc(sizeof(*gr_font->texture));gr_font->texture->width = font.width;gr_font->texture->height = font.height;gr_font->texture->row_bytes = font.width;gr_font->texture->pixel_bytes = 1;unsigned char* bits = malloc(font.width * font.height);gr_font->texture->data = (void*) bits;unsigned char data;unsigned char* in = font.rundata;while ((data = *in++)) {memset(bits, (data & 0x80) ? 255 : 0, data & 0x7f);bits += (data & 0x7f);}gr_font->cwidth = font.cwidth;gr_font->cheight = font.cheight;}
}
系统本身会先去找 font.png 这个资源文件,如果没有就用默认的,所以我们只需要把客户提供的图片改为 font.png 让后放入资源文件夹中即可,测试之后有效果
然后客户对充电动画也有要求,默认的充电动画在没充满的情况下是从0-5每一张图片都会播放,客户要求是 0%-19% 在0-1之间变化,修改后的代码如下
if (gProgressBarType == PROGRESSBAR_TYPE_INDETERMINATE) {gr_blit(gProgressBarIndeterminate[frame], 0, 0, width, height, dx, dy);if (frame > level * (PROGRESSBAR_INDETERMINATE_STATES - 1) / 100) {frame = level * (PROGRESSBAR_INDETERMINATE_STATES - 1) / 100;} else {frame = (frame + 1);}if (level >= 100) {frame = PROGRESSBAR_INDETERMINATE_STATES - 1;}}
#ifdef PICTURE_SHOW_PERCENT_SUPPORTdraw_text_picture(level);
#elsegr_color(0xa4, 0xc6, 0x39, 255);if (level < 10) {draw_text_xy((dy + height / 2), (gr_fb_width()/2 - 20), bat);} else if (level < 100) {draw_text_xy((dy + height / 2), (gr_fb_width()/2 - 30), bat);} else {draw_text_xy((dy + height / 2), (gr_fb_width()/2 - 40), bat);}
#endifgr_flip(); //从下面的方法介绍中得知这个方法的作用是“刷新显示内容”,调用这个方法之后就会重新调用 charge_thread() 这个方法
修改每次刷新的时间为750ms
void *charge_thread(void *cookie) {int bat_level = 0;for (; !is_exit; ) {if(thread_ext_ctrl == CHARGE_THREAD_CTRL){thread_count++;if(thread_count > 5){is_exit = 1;thread_count = 0;}}usleep(1000000/ PROGRESSBAR_INDETERMINATE_FPS);bat_level = battery_capacity();if(bat_level < 0){thread_st = CHARGE_THREAD_EXIT_ERROR;}else{thread_st = CHARGE_THREAD_OK;}pthread_mutex_lock(&gchargeMutex);led_control(bat_level);status_index = charge_health_check();if (screen_on_flag == 1) {draw_progress_locked(bat_level);}pthread_mutex_unlock(&gchargeMutex);//modified beginusleep(750000); //这里原来是500000微秒,现在改为750000微秒//modified end}usleep(200);return NULL;
}
调试方法
./prebuilts/build-tools/linux-x86/bin/ninja -f out/combined-sp7731e_1h10_native.ninja charge 2>&1 | tee charge.log;adb wait-for-device;adb root;adb remount;adb sync vendor;adb shell reboot -p;
如果只修改了图片,只需要把对应的图片 push 到 vendor/etc/res/images
文件夹下关机查看关机充电动画即可
快速模拟测试查看从 0%-100% 的充电效果变化的方法
void *charge_thread(void *cookie) {int bat_level = 0;for (; !is_exit; ) {if(thread_ext_ctrl == CHARGE_THREAD_CTRL){thread_count++;if(thread_count > 5){is_exit = 1;thread_count = 0;}}usleep(1000000/ PROGRESSBAR_INDETERMINATE_FPS);//modified begin//bat_level = battery_capacity();bat_level = bat_level > 100 ? 0 : bat_level++;//modified endif(bat_level < 0){thread_st = CHARGE_THREAD_EXIT_ERROR;}else{thread_st = CHARGE_THREAD_OK;}pthread_mutex_lock(&gchargeMutex);led_control(bat_level);status_index = charge_health_check();if (screen_on_flag == 1) {draw_progress_locked(bat_level);}pthread_mutex_unlock(&gchargeMutex);//Redmine46812 zhangqi modified for power off charge anim 2020/10/27:beginusleep(750000);//Redmine46812 zhangqi modified for power off charge anim 2020/10/27:end}usleep(200);return NULL;
}
minui简介 https://blog.csdn.net/eliot_shao/article/details/87180451
方法简介 https://blog.csdn.net/weixin_30670965/article/details/95561232
gr_init() /*初始化图形设备,分配Pixelflinger库渲染的内存*/
gr_font_size() /*将字体对应的surface长宽赋值给char_width和char_height*/
int gr_init(void); /* 初始化图形显示,主要是打开设备、分配内存、初始化一些参数 */
void gr_exit(void); /* 注销图形显示,关闭设备并释放内存 */
int gr_fb_width(void); /* 获取屏幕的宽度 */
int gr_fb_height(void); /* 获取屏幕的高度 */
gr_pixel *gr_fb_data(void); /* 获取显示数据缓存的地址 */
void gr_flip(void); /* 刷新显示内容 */
void gr_fb_blank(bool blank); /* 清屏 */
void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a); /* 设置字体颜色 */
void gr_fill(int x, int y, int w, int h); /* 填充矩形区域,参数分别代表起始坐标、矩形区域大小 */
int gr_text(int x, int y, const char *s); /* 显示字符串 */
int gr_measure(const char *s); /* 获取字符串在默认字库中占用的像素长度 */
void gr_font_size(int *x, int *y); /* 获取当前字库一个字符所占的长宽 */
void gr_blit(gr_surface source, int sx, int sy, int w, int h, int dx, int dy); /* 填充由source指定的图片 */
unsigned int gr_get_width(gr_surface surface); /* 获取图片宽度 */
unsigned int gr_get_height(gr_surface surface); /* 获取图片高度 */
int res_create_surface(const char* name, gr_surface* pSurface); /* 根据图片创建显示资源数据,name为图片在mk文件指定的相对路径 */
void res_free_surface(gr_surface surface); /* 释放资源数据 */
[SPRD]展锐Android R关机充电动画修改相关推荐
- 展锐android r kernel 快速编译
步骤 1 在 bsp 根目录下执行 source build/envsetup.sh 加载环境变量. 步骤 2 在 bsp 根目录下执行 lunch 选择 product. 步骤 3 在 bsp 根目 ...
- Android 修改关机充电动画
最近一直在修改关机充电动画的问题,我就把一些需要修改的东西,分享给大家 lk-cust_display.h这个文件是修改动画位置,下面以480*800为例 /*// new animation par ...
- android 系统(34)--关机充电图标修改
关机充电图标修改 关机充电图标修改 关机充电main函数 函数set_draw_anim_mode 函数pthread_mutex_init 函数bootlogo_init 函数alarm_contr ...
- android关机位置定位,Android5.0关机充电动画位置
充电动画位置 bootable\bootloader\lk\dev\logo 充电动画对应的分辨率: \bootable\bootloader\lk\project\XX.mk BOOT_LOGO : ...
- 06.MTK关机充电动画显示
关机充电的第一张logo: /vendor/mediatek/proprietary/bootable/bootloader/lk/dev/logo/rules.mk RESOURCE_OBJ_LIS ...
- Android11.0(R) 华为充电动画
根据系统原有的无线充电动画流程,新增有线充电气泡动画. 效果图 修改文件清单 vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/an ...
- 展锐Android 10平台OTA升级
OTA 整体升级包制作步骤(以SC9863A平台为例) 下载项目 AP 的代码. 通过以下命令设置编译环境. source build/envsetup.sh lunch kheader 通过 mak ...
- Android 11 无线充电动画、铃声及问题分析
Android 充电的方式有三种:电源充电,USB充电,无线充电,其中原生实现了无线充电的动画,以及相关提示音,无线充电动画的起始位置则是从PowerManagerService开始 流程分析 1. ...
- android开机logo和动画修改
Android系统开机显示画面分成两个过程,第一个过程从按电源键到Frameworks启动为止.第二个过程从Frameworks启动完成到Launcher程序启动完成. 第一个过程显示的画面是一张图, ...
最新文章
- .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
- BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp
- 记一次特别的往事 while 循环
- 洛谷 - P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并(树上差分+线段树合并)
- 使用Java消费API的一个错误消息PKIX path building failed以及解决方案
- 嫦娥五号完美落月,背后黑科技令人惊叹
- CF590E-Birthday【AC自动机,最大独立集】
- Java ProcessBuilder environment()方法与示例
- 13岁的儿子早恋了,心思都不用在学习上,我要怎么帮助他?
- P1394 山上的国度
- c#窗口操作-句柄操控全解
- Python-Django中的那些命令
- 微型计算机硬件认识和拆装,微型计算机系统硬件组成与外设认识.doc
- 解决向日葵远程不能退出腾讯安全管家,点退出时没反应,也不能远程卸载
- Medical robotics-Regulatory, ethical, and legal considerations for increasing levels of autonomy
- 英寸和厘米的交互python_matplotlib 设置图形大小时 figsize 与 dpi 的关系
- 工业“元宇宙”蓄势待发,未来制造业将如何变化?
- 如何将网络上的共享文件映射到本地
- 高效提升效率的办公软件,快来get吧
- python中字符串转xml对象_Python-Json字符串和XML解析
热门文章
- Neo4j:足球转移图表
- 经典Android开发教程!面试字节跳动两轮后被完虐,附面试题答案
- Excel 文件怎么批量插入首页、扉页、尾页?怎么将某个 Excel 文件批量插入到其它 Excel 文件的指定位置?
- java角谷_[蓝桥杯]角谷猜想问题
- 计算机蓝屏了 怎么维修,电脑蓝屏怎么解决
- Visual Studio NuGet程序包找不到源
- 逐飞K66核心板+逐飞DAP下载器调试方式及接线(SWD)
- 连续仨月霸占牛客榜首!京东T8呕心巨作:700页JVM虚拟机实战手册
- 连续仨月霸占牛客榜首京东T8呕心巨作:700页JVM虚拟机实战手册
- 唐国庆出任木林森执行总经理,给木林森带来怎样的想象空间?