Android是为了适应不同的画面而开发的,需要向资源文件中添加多个图像或多个布局文件。 本文将介绍多个图像。
ldpi、mdpi、xhdpi、xxhdpi和xxxhdpi分别代表什么? 怎么用?
随着单屏幕智能手机的普及,屏幕也越来越大,从经典的iPhone 4的3.5英寸到iphone XR 6英寸以上,安卓手机也逐渐进入6.x英寸的行列。
屏幕尺寸定义:手机对角线的物理尺寸。 以英寸(英寸)为单位,1英寸约为2.54厘米。
普通手机尺寸: 4英寸、4.5英寸、4.0英寸、5.0英寸、5.2英寸、5.4英寸、5.99英寸、6.0英寸、6.2英寸等
2画面分辨率(画面分辨率)分辨率是手机画面的像素数总数,一般是画面宽的像素数乘以画面高的像素数。 分辨率越大,越纤细,可以显示的细节越多。 因为320×240、640×480、1280×720、1280×960、1080×1920、2560×1440等分辨率只是常见的分辨率,所以分辨率还有很多其他数值。 他们的单位是像素。 表示屏幕宽度方向有1080像素,屏幕高度方向有1920像素,如1080×1920。
3像素密度像素密度(dpi、dots per inch; 或PPI,pixels per inch ()每英寸的像素数。 根据屏幕尺寸和屏幕分辨率,如果5.0英寸手机屏幕分辨率为1280×720,则像素密度为192dpi (首先计算对角线上的像素数量的计算过程)。
屏幕密度:
我们已经讨论了像素密度,屏幕密度是什么?
不知道屏幕密度如何定义,其实屏幕密度是像素密度的另一种表示,以160dpi=1.0为标准。 手机出厂后的画面密度包括x、y轴方向的像素密度为固定值。
android划分实际的屏幕密度(low、medium、high、and extra high、extra extra high ) )
常见屏幕: ldpi为120dpi,mdpi为160dpi,hdpi为240dpi,xhdpi为320dpi,xxhdpi为480dpi。 安卓以像素密度160dpi为基准分割屏幕,像素密度为160dpi时屏幕密度为1.0,像素密度为120dpi时屏幕密度为0.75,像素密度为320dpi时屏幕密度为2.0.http://www.sision
privatevoidgetscreeninfo((//屏幕分辨率int screen width=getwindow manager ).getDefaultDisplay ).getWidth ); //屏幕宽度int screen height=getwindow manager (.getdefaultdisplay ) ).getHeight ); //屏幕高Log.e (屏幕分辨率),屏幕宽度=’屏幕宽度); screenHeight=’ screenHeight; //获取像素密度和屏幕密度displaymetricsdm=newdisplaymetrics (; dm=getResources ().getDisplayMetrics ); float density=dm.density; //屏幕密度(像素比率: 0.75/1.0/1.5/2.0 ) int densityDPI=dm.densityDpi; //像素密度(每英寸像素数(120/160/240/320 ) float xdpi=dm.xdpi; //X轴方向像素密度float ydpi=dm.ydpi; //Y轴方向像素密度log.e(xy轴方向的像素密度)、(xdpi=) xdpi ); ydpi=’ ydpi; Log.e (像素密度和屏幕密度)、(density=) density ); densityDPI=’ densityDPI; screenWidth=dm.widthPixels; //屏幕宽度screenHeight=dm.heightPixels; //屏幕高Log.e (屏幕分辨率),屏幕宽度=’屏幕宽度); screenHeight=’ screenHeight; //获取屏幕密度(方法3 ) DM=新显示度量); getWindowManager ().getDefaultDisplay ) (.getmetrics ) ) DM; density=dm.density; densityDPI=dm.densityDpi; xdpi=
dm.xdpi; ydpi = dm.ydpi; Log.e(“屏幕XY轴方向上的像素密度”, “xdpi=” + xdpi + “; ydpi=” + ydpi); Log.e(“屏幕像素密度和屏幕密度”, “density=” + density + “; densityDPI=” + densityDPI); int screenWidthDip = dm.widthPixels; int screenHeightDip = dm.heightPixels; Log.e(“屏幕XY轴方向上的像素密度”, “screenWidthDip=” + screenWidthDip + “; screenHeightDip=” + screenHeightDip); screenWidth = (int)(dm.widthPixels * density + 0.5f); screenHeight = (int)(dm.heightPixels * density + 0.5f); Log.e(” 屏幕分辨率”, “screenWidth=” + screenWidth + “; screenHeight=” + screenHeight); } 4 Android手机常见分辨率和drawable适配说明
手机常见尺寸和对应像素密度
4:3的尺寸
VGA :640×480 (Video Graphics Array)
QVGA :320×240 (Quarter VGA)
HVGA :480×320 (Half-size VGA)
SVGA :800×600 (Super VGA)
5:3的尺寸:
WVGA :800×480 (Wide VGA)
16:9的尺寸:
FWVGA: 854×480 (Full Wide VGA)
HD :1920×1080 High Definition
QHD :960×540
720p :1280×720 标清
1080p :1920×1080 高清
一般分辨率对应DPI:
“HVGA mdpi”
“WVGA hdpi “
“FWVGA hdpi “
“QHD hdpi “
“720P xhdpi”
“1080P xxhdpi “
nodpi里面的资源不会被缩放,无论尺寸是否满足条件。
此时会有一个疑问,手机的像素密度可以是任何值,Android手机只有mdpi,hdpi,ldpi,xhdpi,xxhdpi,xxxhdpi等有限的几个适配目录,Android手机如何适配呢,所以可以推测,Android中获取的屏幕密度,不是对应屏幕真实的屏幕密度值,类似1280720和1290730都会被认为是720p的手机,屏幕密度都是2.0。
注意:上面的一般分辨率对应的dpi只代表一般情况,绝大多数厂商都会遵循,这么说的意思是分辨率和像素密度不是上面的对应关系,还跟手机的尺寸相关,这就是我们看到的很多平板比手机大很多,但是它的分辨率依然是1080p,特别是现在很多智能车载比普通的平板还大,它的屏幕分辨率和普通手机一样,适配时可能只会用到mdpi目录。
各个drawable加载顺序:
android系统适配Drawable时会首先查找屏幕密度尺寸都满足的drawable,如果没有找到:
当应用在设备对应dpi目录下没有找到某个资源时,遵循“先高再低”原则,然后按比例缩放图片如果当前为xhdpi设备(项目中只有xxhdpi,xhdpi,xxhdpi,nodpi,mdpi,hdpi),则drawable的寻找顺序为,首先查找xhdpi目录 如果没找到,依然查找xxhdpi,如果还没有找到xxxhdpi,还没有找到查找nodpi,如果还没有查找hdpi,然后查找mdpi,如果在xxhdpi中找到目标图片,则压缩2/3来使用(因为系统认为它找到了一个比合适尺寸大的图片),如果在mdpi中找到图片,则放大2倍来使用(系统认为它找到了一个比适合尺寸小的图片,需要放大才能保证正常)。
5 为什么2017年以后Android手机适配一般只需要xhdpi和xxhdpi两套资源就可以
2017年以后的android手机一般大小在5寸以上,分辨率至少720p,1080p,所以对应的dpi分别为:
720p 1280720 5寸对应dpi 大约 300dpi
1080p 19201080 5寸对应dpi 大约440 dpi
xhdpi对应320dpi,xxhdpi对应480dpi,所以手机适配一般只需要xhdpi和xxhdpi两套资源就可以。
注意:对于平板,只能电视和车载系统的开发,一般xhdpi和xxhdpi用不到,ldpi,mdpi用的比较多
6 dp 和px的转换
dp是android中用于适配的尺寸,他能保证在不同尺寸密度屏幕上显示的大小相同,有点类似物理尺寸,相同的dp展示效果相同,它们代表的px是不一样的。
dp与px的转换
系统密度为160dpi的中密度手机屏幕为基准屏幕,即320×480的手机屏幕中,1dp=1px。
而在480×800(hdpi,240dpi)的手机上1dp=1.5px.所以dp和px的换算以屏幕密度为准则而不是屏幕的实际密度。