1.为什么适配
(1) 厂商多,设备多, 屏幕的尺寸, 分辨率多.
(2) 大多数的计算方式:
dpi等于(屏幕宽的平方+屏幕高的平方)整体开根号(单位是px),然后除以屏幕尺寸(单位是英寸).
density=dpi/160,
px=density*dp.(我们通常用的是dp去适配,但是绘制view的最终单位都是px,也就是因为dp和px之间的转换导致了适配的不完全)
因为dpi是由屏幕真实的分辨率和尺寸得来的.
注:一些手机并不是这种规范的计算方式,导致适配更加复杂.
2.基础知识
(1) 屏幕尺寸: 屏幕尺寸指屏幕的对角线的长度(物理长度),单位是英寸,1英寸=2.54厘米
(2) 屏幕分辨率(屏幕宽高): 屏幕分辨率是指在纵横向上的像素点数,单位是px,1px=1个像素点。一般以纵向像素*横向像素,如480*320。
(3) 屏幕像素密度(单位dpi): 计算方式->(屏幕宽的平方+屏幕高的平方)整体开根号(单位是px),然后除以屏幕尺寸,就是屏幕分辨率勾股求对角线然后除以尺寸
(4) density:屏幕的逻辑密度,是密度无关像素(dp)的缩放因子,160dpi是系统屏幕显示的基线,1dip = 1px
density=dpi/160,
160为标准屏幕像素密度
(5) px:像素,基本单位,绘制view的最终单位都是px
(6) dp/dip:密度无关像素
(7) sp,即scale-independent pixels,与dp类似,但是可以根据文字大小首选项进行放缩,是设置字体大小的御用单位。
3.方法
A. 基本操作
1wrap_content,match_parent
2LinearLayout,RelativeLayout
3图标使用svg格式(svg的图标大小约是png的1/4)
4.weight
5.layout-600x400
6. .9图可指定拉伸区域
a.限定符(layout-large):
1尺寸:small,normal,large,xlarge
2屏幕方向:land,port
3屏幕宽高比:long(比标准屏幕宽高比明显的高或者宽的这样屏幕),notlong(和标准屏幕配置一样的屏幕宽高比)
4屏幕的最小尺寸:屏幕可用区域的最小尺寸,是指屏幕可用高度或宽度的最小值(sw600dp)
5屏幕可用宽度:指定资源使用时需要的最小宽度,当前是否需要显示多屏布局(w720dp)
B.今日头条适配
正常的公式:density=dpi/160,
今日头条公式:当前设备屏幕总宽度(单位为像素)/ 设计图总宽度(单位为 dp) = density
屏幕的总 px 宽度 / density = 屏幕的总 dp 宽度、
所以屏幕的总 px 宽度=屏幕的总 dp 宽度
C.smallestWidth(values-sw640dp)
插件:ScreenMatch
系统只会寻找小于或等于当前设备 最小宽度
按照百分比缩放布局
不区分屏幕方向的
(如果想让屏幕宽度随着屏幕的旋转而做出改变(values-w640dp))
(如果想区分屏幕的方向来做适配该怎么办呢?那就只有再根据 屏幕方向限定符 生成一套资源文件咯,后缀加上 -land 或 -port 即可,像这样,values-sw400dp-land (最小宽度 400 dp 横向),values-sw400dp-port (最小宽度 400 dp 纵向))
smallestWidth 限定符屏幕适配方案 只是把 dimens.xml 文件中的值从 px 换成了 dp,原理和使用方式都是没变的
关注本人公众号获取更多干货.