大家好,又见面了,我是你们的朋友全栈君。
Android开发为适配不同屏幕需要在资源文件中添加多套图片或者多套布局文件,这篇文章讲解多套图片。
ldpi,mdpi,xhdpi,xxhdpi,xxxhdpi分别代表什么?如何使用。
智能手机普及,屏幕也随之越来越大,从经典的iPhone 4的3.5英寸到iphone XR 6英寸多,Android手机也逐渐进入了6.x英寸行列。 屏幕大小定义:手机对角线的物理尺寸,以英寸(inch)为单位,一英寸大约2.54厘米。 通常的手机尺寸:4英寸,4.5英寸,4.0英寸,5.0英寸,5.2英寸,5.4英寸,5.99英寸,6.0英寸,6.2英寸等
屏幕分辨率:分辨率是手机屏幕的像素点总数,一般用屏幕宽的像素点数乘以屏幕高的像素点数。分辨率越大屏幕越细腻,能够显示的细节就更多。常用的分辨率包括320×240,640×480,1280×720,1280×960,1080×1920,2560×1440这些只是常用分辨率,所以分辨率还有很多其他数值,他们的单位都是像素。类似1080×1920表示屏幕宽度方向上有1080个像素,屏幕高方向上有1920个像素。
像素密度(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。android以像素密度160dpi为基准对屏幕进行划分,当像素密度为160dpi时屏幕密度为1.0,像素密度为120dpi时屏幕密度为0.75,像素密度为320dpi时屏幕密度为2.0. 如何获取屏幕分辨率和像素密度,屏幕密度:
private void getScreenInfo() {
// 获取屏幕分辨率
int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽
int screenHeight = getWindowManager().getDefaultDisplay().getHeight(); // 屏幕高
Log.e( "屏幕分辨率", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);
// 获取像素密度和屏幕密度
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)
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("屏幕分辨率", "screenWidth=" + screenWidth + "; screenHeight=" + screenHeight);
// 获取屏幕密度(方法3)
dm = new DisplayMetrics();
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: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目录。
android系统适配Drawable时会首先查找屏幕密度尺寸都满足的drawable,如果没有找到: 当应用在设备对应dpi目录下没有找到某个资源时,遵循“先高再低”原则,然后按比例缩放图片如果当前为xhdpi设备(项目中只有xxhdpi,xhdpi,xxhdpi,nodpi,mdpi,hdpi),则drawable的寻找顺序为,首先查找xhdpi目录 如果没找到,依然查找xxhdpi,如果还没有找到xxxhdpi,还没有找到查找nodpi,如果还没有查找hdpi,然后查找mdpi,如果在xxhdpi中找到目标图片,则压缩2/3来使用(因为系统认为它找到了一个比合适尺寸大的图片),如果在mdpi中找到图片,则放大2倍来使用(系统认为它找到了一个比适合尺寸小的图片,需要放大才能保证正常)。
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用的比较多
dp是android中用于适配的尺寸,他能保证在不同尺寸密度屏幕上显示的大小相同,有点类似物理尺寸,相同的dp展示效果相同,它们代表的px是不一样的。 dp与px的转换 系统密度为160dpi的中密度手机屏幕为基准屏幕,即320×480的手机屏幕中,1dp=1px。 而在480×800(hdpi,240dpi)的手机上1dp=1.5px.所以dp和px的换算以屏幕密度为准则而不是屏幕的实际密度。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133560.html原文链接:https://javaforall.cn