#如何确定对哪些屏幕尺寸进行适配
在一些第三方网站进行查看,比如友盟等推送集成网站或者其他第三方。对市面上主流的手机屏幕尺寸进行适配。
重要概念
屏幕尺寸
屏幕尺寸的计量单位为inch(英寸),1inch约等于2.54cm。手机屏幕尺寸说的是手机屏幕对角线的长度。
计算单位
- px(像素):屏幕显示的最小计量单位
- dpi(像素密度)
计算方式: d p i = x 2 + y 2 i n c h dpi=\frac{\sqrt{x^2+y^2}}{inch} dpi=inchx2+y2
x是屏幕宽的像素,y是屏幕长的像素,inch是屏幕尺寸 - dip的计算方式:
1
d
p
=
d
p
i
160
∗
p
x
1dp=\frac{dpi}{160}*px
1dp=160dpi∗px
dpi是像素密度,在像素密度为160的时候,1dp=1px - sp是文本大小的单位,官方推荐的大小为12sp、14sp、18sp、22sp四个尺寸;
- 像素区分:不同文件夹存放的dpi大小范围
名称 | 像素密度范围 | icon大小 | 代表分辨率(px) | 換算(px/dp) |
---|---|---|---|---|
mdpi | 120dp-160dp | 48x48px | 320x480 | 1dp=1px |
hdpi | 160dp-240dp | 72x72px | 480x800 | 1dp=1.5px |
xhdpi | 240dp-320dp | 96x96px | 720x1280 | 1dp=2px |
xxhdpi | 320dp-480dp | 144x144px | 1080x1920 | 1dp=3px |
xxxhdpi | 480dp-640dp | 192x192px | 2k | 1dp=4px |
在Google官方开发文档中,说明了 mdpi:hdpi:xhdpi:xxhdpi:xxxhdpi=2:3:4:6:8 的尺寸比例进行缩放。例如,一个图标的大小为48×48dp,表示在mdpi上,实际大小为48×48px,在hdpi像素密度上,实际尺寸为mdpi上的1.5倍,即72×72px,以此类推。
Android主要分辨率对应的文件名称:
1280720—xhdpi
19201080—xxhdpi
854480–hdpi
960540–hdpi
一般情况下,2k分辨率对应xxxhdpi,1080对应xxhdpi,720对应xhdpi
支持各种屏幕尺寸的解决方案
wrap_content的使用
wrap_content是包含组件大小大小不固定;
weight的使用
weight只有在LinearLayout中才可以使用,weight的含义是占剩余控件的比例。match_parent的意思是一个全屏的长度;
尺寸限定符
新建layout-large文件夹,新建布局文件放在给文件夹中,文件名必须与layout文件夹中的文件名对应,这种写法在android3.2之前使用,应用与平板上,在之后版本不起作用。Android3.2之后使用最小宽度限定符新建layout-sw600dp文件夹,sw=small width该文件夹中的布局代表着在宽度为600dp以上的设备上使用。
限定符
在加入限定符以后,在不同的情况下,斯通股将会在不同的文件夹下面找寻定义的文件
屏幕方向限定符
在文件夹名后添加-port(竖直方向)-land(水平方向)
尺寸大小限定符
在文件夹名后添加-sw[判定的最小尺寸],例如
-sw600dp意思就是当屏幕的宽度大于600dp的时候在这个文件夹中进行查询。
最小版本限定符
在文件夹后面加-V[api版本号],例如-v11表示在api11以上的系统里使用该文件夹下的文件代替默认文件夹中的文件。
使用布局别名
在res下建立
res/layout/main.xml
:单面板布局,布局文件
res/layout/man_twopanes.xml
:双面板布局,布局文件
res/values/layout.xml
默认布局赋值别名文件
res/values-sw600dp/layout.xml
宽度大于600dp后的布局赋值别名文件
res/values-sw800dp/layout.xml
宽度大于800dp后的布局赋值别名文件
res/valuse/layout.xml
默认布局
<resources>
<item name="main" type="layout">@layout/main</item>
</resources>
res/valuse-sw600dp/layout.xml
宽度大于600dp的布局
<resources>
<item name="main" type="layout">@layout/main_twopanes</item/>
</resources>
res/valuse-sw800dp/layot.xml
宽度大于800dp 的布局
<resources>
<item name="main" type="layout">@layout/main_twopanes</item/>
</resources>
这样就有了main为别名的布局,在activity中使用setContentView(R.layout.main)
即可。