Android图片适配,美工,开发一看都笑了
Android适配很烦人,看完本文你会认为图片适配很简单。
我们先不看任何讨厌的单位名词。
我们直接上图:
从以上实验简单的分析一个:
截图1,2是同一个手机,截图3,4 是同一个手机,可以从下方的density,desityDPI 等值可以看出来。
截图1 图片设置 64dp
截图2 图片设置 192px
截图3 图片设置 64dp
截图4 图片设置 192px
截图2 与 截图4: 两种屏幕,设置相同的px,显示的结果一定不同。
截图1 与 截图3: 两种屏幕,设置相同的dp(设备独立像素),显示的结果大致不同。
截图3 与 截图4: 使用设置单位不同,但最后结果一样。我们看到 density=3,64dp,192px,3个值存在一定关联:192px = 64dp * 3.0
用截图1 验证: 64dp * 1.5 = 96px , 所以得到关系( px = dp*density倍数 )=>( dp = px/density倍数)。
总结:
美术同学知道的是 px (像素),开发同学知道的是dp。而不同的屏幕的density不同,所以需要有一个基准,比如美术使用1080的屏做为出图依据,那么开发同学用的dp 就要根据1080来计算 dp = px / 3,因为1080屏的density是3.
举个例子,美术基于1080 出了一张图,要求上边距9px, 左边距3px, 图片宽高:120*90
因为 1080 的 density =3 , 设置的值,是上边距 9px/ 3 = 3dp 左边距3px/3 = 1dp, 图片宽高:120/3*90/3 = 40dp*30dp 。
美术要知道出图的基础尺寸,并给出在这个基础之上的一些像素值。
开发要知道这个基本对应的density 是多少,然后转化为dp.
其它的手机非1080的手机怎么处理,使用相同的dp,出来的像素不同,但效果基本一致。
hdip/xhdpi/xxhdpi/ 这些目录是干啥的?这些目录的目的主要是为了提供不同的图,以便订制在不同的屏上显示不同的图。每种dpi 对应该一种屏,如果对应的目录没有找到相应的图,就会向上到高分辨率的目录下找。
如540的手机,density=1.5,对应的目录是hdpi,如果hdpi中没有找到相应该的图片,系统会去 xhdpi中找,再找不到再向xxhdpi中找,都找不到就向下找.(算法是实验的,之后看代码验证)
我们目前的做法,为了减少资源,又能出来更好的效果,我们在放一份图片到xxhdpi中,也就是1080的。小屏幕会压缩,更大屏幕会拉伸。
下面梳理一下相应的名词:
分辨率:1080*1920
屏幕大小:对角线长度,4.0 , 5.0, 5.5
DPI : 每英寸的像素 = 对角线的分辨率 / 屏幕对角线长
DP : Android 开发使用的单位。
density: 密度比 主要是和标准的160dpi对比。如:1080p 的DPI = 480, 那么他对应的 density = 480/160 = 3
density 主要用于根据美术提供的基数进行 换算dp.
dp就是用在android 开发设置具体的
DPI 主要用来确定 手机对应到 drawable 的哪个目录里(hdip/xhdpi/xxhdpi),默认取哪个图。
图片要显示的大小,是由设置的长宽高决定的。如果设置wrap_content,那么系统会根据图片的大小,并设置单位为dp.如一张100px的图,真正显示到手机时,就会变成100dp.
以下代码用来取得系统相关值:
DisplayMetrics dm = new DisplayMetrics();
dm = getResources().getDisplayMetrics();
float density = dm.density; // 屏幕密度(像素比例:0.75/1.0/1.5/2.0)
int densityDPI = dm.densityDpi; // 屏幕密度(每寸像素:120/160/240/320)