小公司3年,Andriod屏幕适配还停留在的初级阶段。
最近看了下慕课网的Android屏幕适配,真是醍醐灌顶。
而此视屏详尽的笔记资料凯子哥(赵凯强)早已流芳——Android屏幕适配全攻略(最权威的官方适配指导)
鸿洋_Android 屏幕适配方案中不同分辨率别名文件生成器
建议大家直接看上面凯子哥的Android屏幕适配攻略。下面是我自己简略的笔记:
一、核心概念与单位详解
屏幕尺寸、屏幕分辨率、屏幕像素密度?
dp dip dpi sp px之间的关系?
- dpi(像素密度):是指每英寸上的像素点数,dpi即”dot per inch”的缩写,屏幕像素密度与屏幕尺寸和屏幕分辨率有关
- px:构成图像的最小单位
- dp dip:Density Independent Pixels的缩写,即密度无关像素;
以160dpi为基准->1dip = 1px , 240dpi 中 1dip = 1.5px;
实践经验,屏幕的宽度为320dp-480dp居多。 - sp :即Scale-Independent Pixels
可以根据文字大小首选项进行放缩
谷歌推荐:12sp 14sp 18sp 22sp
不要设置为奇数,有可能造成精度丢失
综上:仅仅使用dp无法完成所有屏幕的适配,如果根据320dp为宽设置,会造成大屏高分辨率手机有空白区域,反之小屏低分辨率显示不全。
解决:需要根据不同的分辨率设置统一的dp别名,例如:values-1024x600(上面鸿洋大神的文章有快速生成工具)(单位为px,是根据宽高320份以及680份进行等分),注意:需要values设置默认值(单位为dp)。这种做法仍然会丢失部分奇葩分辨率的手机,工作量大且有疏忽,只能慢慢补充。mdpi hdpi xdpi xxdpi 如何计算和区分?
图片文件 | dp范围 |
---|---|
mdpi | 120dpi - 160dpi |
hdpi | 160dpi-240dpi |
xhdpi | 240dpi-320dpi |
xxhdpi | 320dpi-480dpi |
xxxhdpi | 480dpi-640dpi |
在设计图标时,对于五种主流的像素密度mdpi hdpi xhdpi xxhdpi xxxhdpi >> 根据2:3:4:6:8比例进行缩放
二、解决方案:
支持各种屏幕尺寸
支持各种屏幕密度
实施自适应用户界面流程
支持各种屏幕尺寸:
- 使用wrap_content match_parent weight
- 使用相对布局,禁用绝对布局
- 使用限定符
- 使用自动拉伸位符
weight:计算出的宽度=原来宽度+剩余控件所占百分比宽度
// Weight计算伪代码
Button1 0dp weight = 1
Button2 0dp weight = 2
button1宽度:0 + L * 1/3 = 1/3L
button2宽度:0 + L * 2/3 = 2/3L
Button1 match_parent weight = 1
Button2 match_parent weight = 2
button1宽度:L + (L - 2L) * 1/3 = 2/3L
button2宽度:L + (L - 2L) * 2/3 = 1/3L
布局包名别名、最小宽度限定符
包名 | 含义 |
---|---|
layout | 手机布局 |
layout-large | 平板布局(3.2之前) |
layout-sw600dp | 最小宽度限定符(3.2之后)(values-sw600dp : Smallest dimension is 600 dp or higher >> 最小宽度,如果相对较小的一遍在600dp及以上就认为是平板设备)(同理可以设置为sw720dp) |
values-sw600dp-land | 水平方向 |
values-sw600dp-port | 竖直方向 |
布局抽取共用(大小屏手机上使用不同的布局)
res/layout/main.xml 单面板布局
res/layout/main_twopanes.xml 多面板布局
res/values/layout.xml
布局别名:
<resources>
<item name="main" type="layout">@layout/main</item>
</resources>
Android3.2之前的平板布局
res/values-large/layout.xml
<resources>
<item name="main" type = "layout">@layout/main_twopanes</item>
</resources>
Android3.2之后的平板布局
res/values-sw600dp/layout.xml
<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>
此时setContentView(R.layout.main);main应为布局别名
// bool值可以进行数据设置,用来做判断处理
<resources>
<item name="main_layout" type="laytout">@layout/twopanes</item>
<bool name="has_two_panes">true</bool>
</resources>
使用自动拉伸位图(.9图)
.9图
Android Studio自带工具
Eclipse需要借助工具
.9图的空白区域(未拉伸部分),控件为自动为其设置padding属性
图片放在对应的文件夹
默认: 3.86M
drawable-xxhdpi : 11.65M
drawable:74.97M 放大了
drawable-mhdpi:74.95M 放大了
drawable-hdpi:35.38M
尽可能多的切图(可以只一套图放在正确的文件夹里面)(可以缩放,稍高)
谷歌Demo: com.demo.android.newsreader(最佳实践)
实施自适应用户界面流程
1.确定当前布局
2.根据当前布局做出响应
3.重复使用其它活动中的片段
4.处理屏幕配置变化
代码动态设置:
showAtLocation(View parent,int x ,int y)
根据屏幕宽高动态设置