Android系统如何在多个资源文件夹下查找匹配最合适的资源:查找的原则是先找限定符目录下的资源,找不到就就近向上找,一直找不到在回来向下找,比如xhdpi的需求先找xhdpi文件资源,找不到就到xxhdpi找,找不到再到xxxhdpi找,找不到再到hdpi,找不到再到mdpi
需求xhdpi资源, xhdpi--->xxhdpi--->xxxhdpi---->hdpi--->mdpi--->ldpi--->无限定符的文件找
适配的三个因素:屏幕尺寸、屏幕分辨率、屏幕像素密度sqrt(分辨率高*分辨率高+分辨率宽*分辨率宽)/尺寸 ≈ 像素密度
显示分辨率就是屏幕上显示的像素个数,分辨率160×128的意思是水平方向含有像素数为160个
五种主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)应按照 1:1.5:2:3:4 的比例进行缩放
比如只有hdpi有一个500x500的图片,要是在xxhdpi中调用,及1.5:3,那就是1000x1000的图片
比如启动图标标准
手机显示像素 = 图片实际像素尺寸 × 机型DPI / 所在资源目录DPI
支持各种屏幕尺寸
1,控制View的高宽,使用wrap_content(自适应大小)、match_parent(强制扩展到父元素宽高)、weight(权重,LinearLayout特有属性),
2,
使用相对布局,禁用绝对布局
单位使用dp代替px,根据设计稿的按什么原型标注,有px转为dp,比如设计图按照720设计,那就是20px标注=10dp;
字体使用sp,sp和dp类似
3,使用尺寸限定符
比如res/layout-large较大屏幕(例如 7 英寸或更大的平板电脑)的设备上选择此布局,对于最小宽度大于等于 600 dp 的设备,系统会选择 layout-sw600dp,
可使用限定符的 drawable,layout,values
4,使用 .9自动拉伸图片,使用非密度制约像素 dp,sp 1dp = 1px * (sqrt(a*a+b*b)/c)/160
像素密度 假设a,b分别为两个直角边,c为斜边,由勾股定理可得出计算方式:sqrt(a*a+b*b)/c
5,最后带java代码中适配
0dpi ~ 120dpi | ldpi |
120dpi ~ 160dpi | mdpi |
160dpi ~ 240dpi | hdpi |
240dpi ~ 320dpi | xhdpi |
320dpi ~ 480dpi | xxhdpi |
480dpi ~ 640dpi | xxxhdpi |
- dp(设备独立像素)与px的转换
因为ui设计师给你的设计图是以px为单位的,Android开发则是使用dp作为单位的,那么我们需要进行转换:
| 密度类型 | 代表的分辨率(px) | 屏幕密度(dpi)|换算(px/dp)
| --------------------- |:-------------:| -------------------:| -------------:|
| 低密度(ldpi) 240x320 120 1dp=0.75px
| 中密度(mdpi) 320x480 160 1dp=1px
| 高密度(hdpi) 480x800 240 1dp=1.5px
| 超高密度(xhdpi) 720x1280 320 1dp=2px
| 超超高密度(xxhdpi) 1080x1920 480 1dp=3px
sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。
参考:
http://www.cocoachina.com/android/20151030/13971.html
http://blog.csdn.net/dfskhgalshgkajghljgh/article/details/50564682
http://www.jianshu.com/p/ec5a1a30694b
PPi和Dpi的区别
分辨率只能用来描述图片的像素信息,不能描述图片清晰度
PPI只能用来描述屏幕的显示密度,也不能描述图片的清晰度
DPI才能用来描述图片显示的清晰度,表示图片在屏幕上的显示效果。
当图片分辨率与屏幕显示像素相同时, DPI与PPI值相等
当图片分辨率大于屏幕显示像素时, DPI与PPI值相等,图片显示较差
当图片分辨率小于屏幕显示像素时, DPI值< PPI值相等,图片显示正常,屏幕未达到最佳显示效果。
全屏的适配,刘海屏和虚拟按键
//显示到刘海区
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
getWindow().setAttributes(lp);
}
//隐藏虚拟按键
if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) {
View view = this.getWindow().getDecorView();
view.setSystemUiVisibility(View.GONE);
} else if (Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
int uiOptions =View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
}