少年游

欲买桂花同载酒,终不似,少年游。

0%

Android全适配

基本知识

屏幕像素密度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
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
29
30
res/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-large/main.xml 双面板

<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>

最小宽度限定符

Google android3.2之后新规:按屏幕最短的那个边,如果大于600dp,要使用layout-sw600dp

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
28
29
res/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
9
res/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)