系统dpi与应用中的图片缩放关系

来源:互联网 发布:数组和链表有什么区别 编辑:程序博客网 时间:2024/06/07 00:29

一 、 背景

android系统在某些情况下,会默认缩放图片资源,这在EInk上会使图片发虚。如果图片资源放在nodpi下,系统就不会去缩放,目前电子书都是采 用这种方案使EInk屏幕显示原始图片的效果。但是系统dpi和应用开发中资源存放位置到底有着什么关系呢? 在实际的UI制作中又需要参考机型中的哪些属性值呢?

二、数据说明

首先先复习概念:

px (pixels)像素 – 是像素,就是屏幕上实际的像素点单位。
dip或dp (device independent pixels)设备独立像素, 与设备屏幕有关。
sp (scaled pixels — best for text size):类似dp, 主要处理字体的大小。

dpi(dot per inch):屏幕像素密度,每英寸多少像素

density:density表示每英寸有多少个显示点(逻辑值),它的单位是dpi;简单的说就是一个比例系数,用来将Dip(设备独立像素)转换成实际像素px。

具体公式是: px = dip*density+0.5f;

  • 验证设备是T63 普分屏 和 T63高分屏 机器;

data2

 

dpi计算公式: dpi = √(宽^2+高^2 )÷屏幕尺寸

如:T63 XD4 的dpi = √(758^2+1024^2 )÷6 = 212.337519582

T63 TC1的dpi = √(1072^2+1448^2 )÷6 = 300.27246886

电子书dpi是在源码的  device / rockchip / rk30sdk / device.mk 文件声明了ro.sf.lcd_density的值,在电子书系统里面的/system/build.prop 系统配置文件里面也可查看;

T63XD4和T63TC1的ro.sf.lcd_density值都是实际dpi值,T63XD4为212,T63TC1为300

上图是android中定义的density和densityDpi的关系,所以T63XD4的density为: 212/160 = 1.325;T63XD4的density为:300/160 = 1.875

  • 测试过程:

编写一个测试工程,将一张图片放置不同的资源文件夹下面,查看图片显示的实际显示效果。

原图图片大小为: 112 px * 112 px

以下是将图片放置不同资源文件夹下面的效果显示大小(单位都是px)


  • data4

  • 数据分析:

首先系统在资源查找过程中,根据android的18个资源相关维度,查询出当前应用最合适的资源文件夹。我们这里只验证在dpi这个维度的查找过程。有兴趣的同学可以跟踪系统整个查找资源过程,主要处理在系统/framework/base/core/java/android/content/res/的Resources.java,AssetManager.java 两个资源管理类里面;

从上图数据我们可以分析得出xd4和tc1机器在dpi资源文件夹中的优先级由高到低:

XD4: 1. hdpi  2. xhdpi  3. mdpi 4. ldpi  5.nodpi

TC1: 1. xhdpi  2. hdpi 3. mdpi 4. nodpi 5. ldpi

那么显示大小在android系统里面是怎么计算得来的呢?

如:

读取mdpi中资源:

XD4: 112×(212÷160)= 148.4 ≈ 148 px

TC1: 112×(300÷160)= 210 px

读取hdpi中资源:

XD4: 112×(212÷240)= 98.9333 ≈ 99 px

TC1: 112×(300÷240)= 140 px

因为我们电子书系统设置的dpi值不是android标准的dpi值,就是说不是在【120,160,240,320】里面,所以我们把资源放在hdpi,xdpi或者其他文件夹下面都是会有缩放的。最终我们放在了no-dpi里面,这个文件夹是将图片原始大小显示到屏幕的,即图片宽高多少像素,在机器里面显示就是宽高多少像素。

其实,我们可以将系统dpi设置成240或者320这样的标准dpi,然后将UI资源放置在hdpi或者xhdpi的对应的文件夹中,图片大小也是不会变的。

0 0