Recovery只有在升级的时候才会呈现给用户,所以界面一般都很简单,没有android上层那么绚丽,所以recovery下面对图片的支持很有限,仅支持png图片显示,所以我们可以看到,recovery下面所有的背景以及提示信息,都是以png格式图片的资源文件存在。一般的厂商都会觉得,原生的机器人很low,都会重新整理一套升级显示的UI,但并非所有的png图片recovery都是支持的,下面我们来分析下recoverypng资源文件的支持。

 

6.1 资源文件路径以及分类

    我们资源文件的路径在SDK中的bootable/recovery/res-相关的目录中,针对不同的DPI的场景,分别有不同的资源文件:


    一般情况下,dpi对应的分辨率如下:

       mdpi       HVGA            480*320

        hdpi       WVGA            800*480
                   FWVGA           854*480
                   QHD             960*540
        xhdpi      720P            1280*720
        xxhdpi     1080P           1920*1080

        xxxhdpi     4K             4096×2160

 

    针对分辨率,PPI DPI分不清的,可以参考之前的一篇博客:分辨率 PPI DPI概念定义详解http://blog.csdn.net/csdn66_2016/article/details/70331919

 

6.2 PNG支持的种类

    并非所有的PNG图片,在recovery下面都可以显示,这也是很多人会遇到的问题,明明是png图片,怎么还是不能显示呢,recovery原生对png图片的支持如下:

      bit_depth         channels        color_type

         8                 3                2

        <=8                1                0

        <=8                1                3

    其中bit_depth是位深度, channels是指支持的颜色的种类,color_type是值颜色类型。我们需要记住的是:

    bit_depth不能大于8

    color_type值有 PNG_COLOR_TYPE_GRAY0

                   PNG_COLOR_TYPE_RGB2

                   PNG_COLOR_TYPE_PALETTE3

    channels值,与color_type有关,PNG_COLOR_TYPE_GRAYPNG_COLOR_TYPE_PALETTE时,只有一种颜色,PNG_COLOR_TYPE_RGB时有三种颜色

 

6.3 判断PNG属性方法

    我们上节描述了,通过三个属性,来看一个png图片是否能在recovery中显示,当我们拿到一个png图片的时候,怎么分析呢,我们可以写个小的获取png info的程序。

 

  第一步:编译libpng.a库文件

    我们从官网下载png的源码,http://www.libpng.org/pub/png/libpng.html,然后在服务器解压,然后编译:./configure CC=gcc --prefix=$PWD/_install, make, make install; 然后就可以生成libpng.a以及png.h相关文件了。


  第二步:写sample

  pnginfo.c

#include #include #include #include "png.h"int main(int argc ,char **argv) {    unsigned char header[8];    size_t bytesRead;    int result = 0;    FILE* fp = NULL;    png_structp png_ptr = NULL;    png_infop info_ptr = NULL;    int color_type, bit_depth;    png_uint_32 width;    png_uint_32 height;    png_byte channels;    if (argc !=2 ) {        printf("eg:./pnginfo png_name\n");        return -1;    }    fp = fopen(argv[1], "rb");    if (fp == NULL) {        result = -1;        goto exit;    }    bytesRead = fread(header, 1, sizeof(header), fp);    if (bytesRead != sizeof(header)) {        result = -2;        goto exit;    }    if (png_sig_cmp(header, 0, sizeof(header))) {        result = -3;        goto exit;    }    png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);    if (!png_ptr) {        result = -4;        goto exit;    }    info_ptr = png_create_info_struct(png_ptr);    if (!info_ptr) {        result = -5;        goto exit;    }    if (setjmp(png_jmpbuf(png_ptr))) {        result = -6;        goto exit;    }    png_init_io(png_ptr, fp);    png_set_sig_bytes(png_ptr, sizeof(header));    png_read_info(png_ptr, info_ptr);    png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth,            &color_type, NULL, NULL, NULL);    channels = png_get_channels(png_ptr, info_ptr);    printf("pnginfo bit_depth:%d, channels:%d, color_type:%d\n", bit_depth, channels, color_type);exit:    if (fp != NULL) {        fclose(fp);        fp = NULL;    }    printf("pnginfo result:%d\n", result);    return result;    }
makefile:

CC=gccTARGET=pnginfo%.o:%.c$(CC) -c $(CFLAGS) $(CPPFLAGS) -o [email protected] $

  执行make即可生成pnginfo


  第三步:获取png属性

  ./pnginfo icon_error.png

  


6.4 png转换

    如果我拿到的png图片,不支持怎么办呢,我们可以使用PS工具,把png图片转换为recovery可支持的格式即可,如果又不太会使用PS工具呢,还有个更简单的方法,采用QQ的截图功能,然后另存为png图片即可,QQ截图保存的png是标准的RGB格式,即bit_depth(8)channels(3)color_type(2)


6.5 总结

    通过上述了解,现在知道了recovery的图片资源文件png的信息了,怎么去判断png是否能够在recovery中显示,以及如果制作recovery支持的png背景图片了。




更多相关文章

  1. 如何在Android(安卓)Studio中使用Gradle发布项目至Jcenter仓库
  2. 【cocos2dx-3.0beta-制作flappybird】就要结束了吗—Android交叉
  3. 2013新春奉送:Android摄像头开发完美demo---(循环聚焦,缩放大小,
  4. Android读取excel文件小结(读取大数据量的excel文件)
  5. android不生成R文件
  6. Android多分辨率支持以及各种类型图标尺寸大小
  7. App基于html/css/js的开发
  8. XML解析和生成之--pull(android内置)
  9. Android(安卓)程序以及在4.4.4以上报错但是在4.4.4以上不报错

随机推荐

  1. Android(安卓)API Guides--Application F
  2. 【Android(安卓)清单文件下的 Activity各
  3. 在程序中设置android:gravity 和 android
  4. android:radius设置圆角失败的问题
  5. Android多分辨率适配框架(1)— 核心基础
  6. android:layout_gravity和android:gravit
  7. Android(安卓)模拟器安装及使用教程
  8. Android(安卓)Studio导入第三方类库的方
  9. 【Android布局】在程序中设置android:gra
  10. 欢迎进入Android的世界