今日头条屏幕适配方案:
https://github.com/JessYanCoding/AndroidAutoSize
Flutter中:
用ScreenUtil()组件
问题:
- 什么是屏幕尺寸、屏幕分辨率、屏幕像素密度?
- 什么是dp、dip、dpi、sp、px以及他们之间的关系?
- 什么是mdpi、hdpi、xdpi、xxdpi以及如何计算和区分?
1.屏幕尺寸
屏幕尺寸指的是屏幕对角线的长度。
单位是英寸,1英寸=2.54cm
2.屏幕分辨率
屏幕分辨率是指在横纵向上的像素点数.
单位是px,1px=1个像素点
一般以纵向像素*横向像素。eg:1920*1080
屏幕分辨率越高,显示效果越好。
3.屏幕像素密度
屏幕像素密度是指每英寸上的像素点数。
单位是dpi,即dot per inch
屏幕像素密度与屏幕尺寸和屏幕分辨率有关。
其决定了每英寸像素点数越大的话,那么其屏幕像素密度越高,相对而言,其相对显示效果就越好。
从Nexus 5 来说,其屏幕尺寸是4.95inch,分辨率是1920*1080.
其官方dpi是445
下面说明一下如何算出dpi=445:
先看看4.95inch是指的对角线的长度,而dpi是屏幕像素密度是指每英寸上的像素点数。
然后用对角线的像素点数除以4.95英寸,就得出了dpi,即每英寸上的像素点数。
4.px
px是像素,构成图像的最小单位。一般在进行UI设计以及Android原生api的时候返回的数值都是以px作为计量单位。
5.dp、dip
dp和dip是一样的。但是注意区分dip不等于dpi.
dp、dip都是密度无关像素,即Density Independent Pixels。
以160dpi为基准,1dip=1px
这也就是说,使用px不能保证在不同分辨率和不同像素密度上保持相同的效果。
而使用dp作为单位:
所以在不同分辨率和不同像素密度的设备上,通过使用dp作为单位就可以保证在不同设备上显示相同的效果。
6.sp
Scale-Independent Pixels。可以根据文字大小首选项进行缩放。【对于文字的对齐方式需要考虑baseline基线问题】
Google推荐使用12sp以上,且可以用12sp、14sp、18sp、22sp作为字体的首选大小,不要用奇数或者小数,如果使用奇数或者小数,在进行字体缩放的时候会造成精度的丢失。
以上说明的是计量单位。
这里介绍对不同像素密度dpi的区分:mdpi hdpi xdpi xxdpi
对不同的像素密度进行区分是为了适配方便,在不同的像素密度的设备上图片的显示效果是不一样的,为了保证在不同的像素密度的设备上都能有好的显示效果就需要为不同的设备提供不同的图片。
新建android工程为我们创建了很多drawable文件夹,在里面可以放图片,我们需要把符合我们像素密度的文件放到对应的文件夹里面,当我们的APP运行的时候,系统会按照当前设备的特性自动去对应的文件夹里面寻找适合的图片。【注意:可以自己尝试,一张图片只放到一个像素密度文件夹的时候,其内存占用是多大。试验后就会明白为什么需要把不同像素密度的文件夹而可以正确的减少内存开销】
名称 | 像素密度范围 |
mdpi | 120dpi~160dpi |
hdpi | 160dpi~240dpi |
xhdpi | 240dpi~320dpi |
xxhdpi | 320dpi~480dpi |
xxxhdpi | 480dpi~640dpi |