基本知识
屏幕像素密度dpi
- 屏幕尺寸单位:1英寸=2.54厘米
- 屏幕像素密度:dpi(每英寸上面像素点个数)
例子:1920*1280 5.2inch
Dpi = sqrt(1920^2+1280^2)/5.2
关于dp,dip
- 基准160dpi:1dip=1px
320dpi上,1dip = 2px;
任意设备上,1dpi是多少。也就是1dip = dpi/160 px。
全适配
- 使用wrap_content、match_parent、weight
- 使用相对布局、禁用绝对布局
- 使用限定符
- 使用自动拉伸位图
布局权重layout_weight
计算出的宽度 = 控件原始宽度 + 剩余宽度*百分比。
假定屏幕宽度为L,横向线性布局
Button1:match_parent 宽度为L
Button2:match_parent 宽度为L
控件总宽度:2L
剩余宽度为 = 屏幕宽度 - 控件总宽度
Button1:2/3L = L+(L-2L)(1/3)
Button2:1/3L= L+(L-2L)(2/3)假定线性布局下设置宽度为O
Button1:2/3L = 0 + (L-0)(1/3)
Button2:1/3L= 0 + (L-0)(2/3)
相对布局
这个不多说。
限定符
屏幕最小宽度限定符layout-sw600dp
屏幕方向限定符 layout-sw600dp-port layout-sw600dp-land
尺寸限定符
Google android3.2之前规定
在手机上使用,我们一般是单面板模式 res/layout/main.xml 单面板
在平板上使用,我们一般采用双面板模式 res/layout-large/main.xml 双面板
这样我们在对应文件下写两个布局分别适配。
1 | res/layout/main.xml 单面板 |
最小宽度限定符
Google android3.2之后新规:按屏幕最短的那个边,如果大于600dp,要使用layout-sw600dp1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29res/layout/main.xml,单面板(默认)布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="match_parent" />
</LinearLayout>
res/layout-sw600dp/main.xml,双面板布局: Small Width 最小宽度
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<fragment android:id="@+id/headlines"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.HeadlinesFragment"
android:layout_width="400dp"
android:layout_marginRight="10dp"/>
<fragment android:id="@+id/article"
android:layout_height="fill_parent"
android:name="com.example.android.newsreader.ArticleFragment"
android:layout_width="fill_parent" />
</LinearLayout>
屏幕方向限定符
这个主要针对平板。1
2
3
4
5
6
7
8
9res/values-sw600dp-land/layouts.xml:
<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>
res/values-sw600dp-port/layouts.xml:
<resources>
<item name="main" type="layout">@layout/main</item>
</resources>
布局别名
让系统去分局values命名去选择要使用的布局文件。
并采用布局别名的方式,写法依旧是setContentView(R.layout.main);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
res/layout/main.xml: 单面板布局
res/layout-large/main.xml: 多面板布局
res/layout-sw600dp/main.xml: 多面板布局
res/layout/main.xml 单面板布局
res/layout/main_twopanes.xml 双面板布局
setContentView(R.layout.main);
默认布局
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>
自动拉伸位图
图片格式的自适应
.9图:picture.9.png:
左、上:拉伸区域(横纵向放缩)
右、下:padding box(optical)(和边框的距离即为padding)