zoukankan      html  css  js  c++  java
  • android recovery 升级UI显示之资源文件

     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 <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #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
    ");
            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
    ", bit_depth, channels, color_type);
    
    exit:
        if (fp != NULL) {
            fclose(fp);
            fp = NULL;
        }
    
        printf("pnginfo result:%d
    ", result);
        return result;
        
    }
    

    makefile:

     

    CC=gcc
    TARGET=pnginfo
    
    %.o:%.c
    	$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $<
    
    all:pnginfo.o
    	$(CC) -o $(TARGET) $< -L. -lpng -lz -lm
    
    clean:
    	rm -rf *.o $(TARGET)

      执行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背景图片了。

  • 相关阅读:
    Linux下守护进程的编程实现(转)
    gcc 中-I、 -L 与-l选项的作用
    va_list 、va_start、 va_arg、 va_end 使用说明
    sizeof('a')在C与C++中的区别
    Qt主要类简介
    linux命令
    linux文件编程
    linux一些基本命令
    Linux主机SSH免密设置解析
    javaweb添加拦截器
  • 原文地址:https://www.cnblogs.com/codeking100/p/10338546.html
Copyright © 2011-2022 走看看