为什么要做适配?Android碎片化
Android系统碎片化:基于Google原生系统,小米定制的MIUI、魅族定制的flyme、华为定制的EMUI等等;
Android机型屏幕尺寸碎片化:5寸、5.5寸、6寸等等;
Android屏幕分辨率碎片化:320x480、480x800、720x1280、1080x1920等
https://screensiz.es/phone 上可以查看市面上流行的手机屏幕尺寸:
像素(px)
- 含义:通常所说的像素,就是CCD/CMOS上光电感应元件的数量,一个感光元件经过感光,光电信号转换,A/D转换等步骤以后,在输出的照片上就形成一个点,我们如果把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位“像素”(Pixel)。简而言之,像素就是手机屏幕的最小构成单元。
- 单位:px(pixel),1px = 1像素点
- 一般情况下UI设计师的设计图会以px作为统一的计量单位。
- 像素是绝对单位, 1px就代表固定的尺寸,全天下所有的1px都是一样大的
- 那么什么是相对单位?比如1%就是相对的
分辨率
- 含义:手机在横向、纵向上的像素点数总和
- 一般描述成: 宽*高 ,即横向像素点个数 * 纵向像素点个数(如1080 x 1920)。
- 单位:px(pixel),1px = 1像素点
屏幕尺寸(in)
- 含义:手机对角线的物理尺寸
- 单位: 英寸(inch,缩写in),一英寸大约2.54cm
- 常见的屏幕尺寸有4.7寸、5寸、5.5寸、6寸
屏幕像素密度(dpi) vs dip
- 含义:每英寸的像素点数。
- 例如每英寸内有160个像素点,则其像素密度为160dpi。
- 单位:dpi(dots per inch)
- 计算公式: 像素密度 = 像素 / 尺寸 (dpi = px / in)
- 标准屏幕像素密度(mdpi): 每英寸长度上还有160个像素点(160dpi),即称为标准屏幕像素密度(mdpi)。
xlarge screens are at least 960dp x 720dp
large screens are at least 640dp x 480dp
normal screens are at least 470dp x 320dp
small screens are at least 426dp x 320dp
屏幕尺寸、分辨率、像素密度三者关系
密度无关像素(dp或dip) vs dpi
- 含义:density-independent pixel,叫dp或dip,与终端上的实际物理像素点无关
- 单位:dp,可以保证在不同屏幕像素密度的设备上显示相同的效果,是安卓特有的长度单位。
- 场景例子:假如同样都是画一条长度是屏幕一半的线,如果使用px作为计量单位,那么在480x800分辨率手机上设置应为240px;在320x480的手机上应设置为160px,二者设置就不同了;如果使用dp为单位,在这两种分辨率下,160dp都显示为屏幕一半的长度。
- dp与px的转换:px = density * dp = (dpi / 160) * dp、density = dpi / 160
- px = dp * (dpi / 160)
- 320* 480,dpi=160,1dp = 1px, 160dp =160px
- 640*960 160dp = 320px
对于五种主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)应按照 2:3:4:6:8 的比例进行缩放
比如美工在1280 * 1920分辨率的画布上标注一张图片的宽是30px,那么我们在程序中应该写多少dp的宽度?
按照google官方标准1280*1920分辨率是属于480dpi,density=3,所以30px=10dp,那么我们在程序中应该写10dp的宽度就可以了吗?是不可以的,因为市面上的手机太多了,同样的分辨率的手机屏幕尺寸却千差万别,这样写可能在5inch的手机屏幕上显示效果和UI图上的效果一样,但是在3inch或者6inch手机上的显示效果就会和UI图上的效果差别很大,所以要做适配(也就是说如果各个手机厂商都按照google官方标准,多大分辨率就对应相应规定多大的手机屏幕尺寸,那么我们就不用适配了,直接写换算后的dp值就可以了!)。
那既然用dp也要适配,为什么不直接用px?
因为dp是密度无关像素,320480的屏幕上160dp=160px,如果屏幕大小不变,分辨率改为:640960,则160dp=320px,我们只需要适配dp就可以了!
独立比例像素(sp)
- 含义:scale-independent pixel,叫sp或sip
- 单位:sp,字体大小专用单位
- Android开发时用此单位设置文字大小,可根据字体大小首选项进行缩放;
- 推荐使用12sp、14sp、18sp、22sp作为字体大小,不推荐使用奇数和小数,容易造成精度丢失,12sp以下字体太小
sp 与 dp 的区别
- dp只跟屏幕的像素密度有关;
- sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。
获取屏幕密度
获取屏幕的density值:
最终都是要把dp转换成px进行绘制的
适配方案
- 布局组件的适配
- 布局的适配
- 代码适配: 接口适配: 加载图片的时候,请求图片时附带图片宽高参数,后台返回对应宽高的图片。
布局组件的适配
指适配布局组件的大小。
- 使用密度无关像素(dip、dp)指定尺寸
- 使用相对布局或线性布局,不要使用绝对布局
- 使用wrap_content、match_parent、权重
- 使用minWidth、minHeight、lines等属性
- dimens使用(根据限定符去找适合的values文件夹下的dimens.xml文件,比如values-sw320dp、values-sw600dp、values-sw720dp)
更多限定符参考:
https://developer.android.google.cn/guide/topics/resources/providing-resources.html
布局的适配
指去适合的布局文件夹下找合适的布局文件。
- 使用Size限定符
- 最小宽度限定符
- 使用屏幕方向限定符
- 使用布局别名
- 多套layout适配
图片的适配
- LOGO 图标
- 普通图片和图标
- 自动拉伸位图:Nine-Patch的图片类型
- 动画、自定义view、shape:一些背景可以用自定义view、shape
ImageView的ScaleType适配
-
android:scaleType=“center”
保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size时,多出来的部分被截掉 -
android:scaleType=“center_inside”
以原图正常显示为目的,如果原图大小大于ImageView的size,就按照比例缩小原图的宽高,居中显示在ImageView中。如果原图size小于ImageView的size,则不做处理居中显示图片 -
android:scaleType=“center_crop”
以原图填满ImageView为目的,如果原图size大于ImageView的size,则与center_inside一样,按比例缩小,居中显示在ImageView上。如果原图size小于ImageView的size,则按比例拉升原图的宽和高,填充ImageView居中显示 -
android:scaleType=“matrix”
不改变原图的大小,从ImageView的左上角开始绘制,超出部分做剪切处理 -
androd:scaleType=“fit_xy”
把图片按照指定的大小在ImageView中显示,拉伸显示图片,不保持原比例,填满ImageView. -
android:scaleType=“fit_start”
把原图按照比例放大缩小到ImageView的高度,显示在ImageView的start(前部/上部) -
android:sacleType=“fit_center”
把原图按照比例放大缩小到ImageView的高度,显示在ImageView的center(中部/居中显示) -
android:scaleType=“fit_end”
把原图按照比例放大缩小到ImageView的高度,显示在ImageVIew的end(后部/尾部/底部)
刘海屏
google官方刘海屏适配方案
https://developer.android.com/reference/android/view/DisplayCutout
各大厂商的方案
华为: https://devcenter-test.huawei.com/consumer/cn/devservice/doc/50114
OPPO: https://open.oppomobile.com/service/message/detail?id=61876
vivo: https://dev.vivo.com.cn/doc/document/info?id=103
折叠屏
华为: https://developer.huawei.com/consumer/cn/devservice/doc/90101
权限分类
Normal Permissions
Dangerous Permission
查看命令
adb shell pm list permissions -d -g
全部申请下来
百度地图
还得写一遍
https://developer.android.google.cn/training/multiscreen/screendensities#java
http://developer.android.com/guide/practices/screens_support.html
https://developer.android.google.cn/guide/practices/screens_support.html