android屏幕适配库,Android屏幕适配之布局设置(二)
書接上回,我們已經(jīng)了解了一些關(guān)于適配的一些相關(guān)概念,接下來我們會了解一下,在設(shè)置布局時我們應(yīng)該注意的地方。
盡量不去設(shè)定具體的尺寸值。
為了確保布局適應(yīng)各種尺寸的屏幕,在保證功能實(shí)現(xiàn)的前提下,最好不要寫死一些尺寸,這樣的硬編碼,我們最好使用“match_parent”,”wrap_content”,”weight”這些不用指定具體的尺寸值的參數(shù),這樣視圖就會根據(jù)自身需要的空間去充填。這樣就可以讓布局去適應(yīng)各種屏幕的尺寸,當(dāng)屏幕有旋轉(zhuǎn)時也不會受到影響。
這里我們重點(diǎn)說一下“weight”,用過LiearLayout的同學(xué)應(yīng)該都知道這個是什么意思,它是LinearLayout獨(dú)有的屬性,我們可以使用這個屬性對界面成比例的分配,當(dāng)我們的布局對比例有要求時,我們就可以使用這個屬性進(jìn)行設(shè)置。
既然是成比例,肯定會有的一個比例的計(jì)算規(guī)則。為了縮短篇幅,我們直接給出計(jì)算公式(我們只給出橫向的,豎向類似):
控件寬度 = 控件的原有寬度 +((LinearLayout寬度 - (所有子控件寬度總和))/ 所有子控件的weight總和) × 控件的weight值
控件的寬度=控件的原有寬度+(LinearLayout的寬度-(所有子控件的寬度和)÷所有子控件的weight總和))×控件的weight值
比如我們現(xiàn)在有個的屏幕是 320x480,根布局為LinearLayout,狂傲為”match_parent”,方向?yàn)闄M向,其中有兩個Button ,A和B,且A,B的android:layout_width屬性為”match_parent”,weight屬性值為1,那么根據(jù)公式,我們計(jì)算一下A的寬度:
A=320+((320-(320+320))/2)*1 =320+(-160) *1 = 160
即整個布局的一半;關(guān)于這個這里不再細(xì)講,感興趣的同學(xué)可以去大神趙凱強(qiáng)的博客去看一下。
千萬不要使用絕對布局
絕對布局里東西都是限定死的,對我們適配極為不利,我們不要使用它,我們優(yōu)先使用 RelativeLayout,LinearLayout。
其中 RelativeLayout中的控件位置都是相對的,我們可以根據(jù)不同需求調(diào)整控件的位置,而LinearLayout 它其中的控件的方向都是線性的,對著這方面有要求的可以優(yōu)先使用。
考慮Fragment的使用
關(guān)于這個可以參看我之前寫的,關(guān)于Fragment的內(nèi)容希望會對大家有幫助
使用尺寸限定符
在Fragment里已經(jīng)介紹過尺寸限定符了,這里再具體說一下。
為什么要使用尺寸限定符
大家都知道,手機(jī)跟平板的尺寸差別很大,有的平板是手機(jī)的兩倍大小,當(dāng)我們的應(yīng)用需要在手機(jī)或者平板上運(yùn)行時,同一個界面 在手機(jī)上顯示很好,但是到了平板就會奇丑無比,所以有時候我們會設(shè)計(jì)兩款布局,分別在手機(jī)和平板顯示,但是我們又不想去寫兩個Activity,怎么辦?這樣我就會用到尺寸限定符。
默認(rèn)的 我們的布局是放到 layout這個文件夾下,我們的應(yīng)用運(yùn)行時,只會從這個文件夾下加載布局。 當(dāng)我們希望不同大小的手機(jī)或者平板加載不同的布局時,我們就會創(chuàng)建一些其它的文件來放置布局。一般的我們會使用尺寸限定符來命名這些文件夾,這些限定會跟在layout后面,并以“—”間隔,當(dāng)然這寫限定符不僅適用于layout,也同樣適用于values,下面列舉兩種:
限定符
功能介紹
large
系統(tǒng)會在屬于較大屏幕(例如 7 英寸或更大的平板電腦)的設(shè)備上選擇此布局。系統(tǒng)會在較小的屏幕上選擇layout下的布局。
sw600dp
布局僅適用于最小寬度為 600 dp 的屏幕, 但 Android 版本低于 3.2 的設(shè)備不支持此技術(shù),原因是這些設(shè)備無法將?sw600dp?識別為尺寸限定符,因此您仍需使用?large?限定符
比如我們現(xiàn)在有一款新聞app,當(dāng)在小屏幕上時,只顯示新聞列表的單面板布局,在大屏幕上時,在屏幕的左邊顯示列表,在屏幕的右邊顯示選中的新聞的具體內(nèi)容 的雙面板布局,如下:
res/layout/main.xml:?單面板布局
res/layout-large/main:?多面板布局
res/layout-sw600dp/main:?多面板布局
其中后兩個文件是一樣的,只是第二個是為了適配Android 3.2設(shè)備,第三個是為了適配版本較低的Android設(shè)備的。為了避免這種重復(fù)出現(xiàn)的布局文件,影響我們的維護(hù),我們可以使用別名文件,例如:
res/layout/main.xml,單面板布局
res/layout/main_twopanes.xml,雙面板布局
我們同時在layout下創(chuàng)建兩個布局。如果有些經(jīng)驗(yàn)的Androider,應(yīng)該知道我們一半引用不同分辨率的資源,都會在不同values文件夾下,例如:values-hdpi;那么這里我們也會用類似的方法來飲用不同的布局。
首先我們引用普通的布局,也就第一個單面板布局。
在res/values/下創(chuàng)建layouts.xml
@layout/onepane
然后我們引用大屏的布局
在res下創(chuàng)建values-sw600dp文件夾,然后在該文件夾下創(chuàng)建layouts.xml:
@layout/main_twopanes
類似的我們創(chuàng)建values-large/layout.xml
@layout/main_twopanes
后兩個文件內(nèi)容相同,我們只是給main在不同的分辨率下的布局設(shè)置了一個別名。只要我們在引用布局的時候引用的是 “main”,設(shè)備就會動態(tài)的根據(jù)屏幕的分辨率去加載不同的布局。
屏幕方向限定符
上面我們只是限定了屏幕的大小,但是我們手機(jī)的橫豎屏顯示的內(nèi)容也千差萬別,如何限制在不同分辨率下的橫豎屏的顯示布局呢?Android給我們提供了屏幕方向限定符:
限定符
功能介紹
land
橫屏,它可以跟尺寸限定符一起使用,例如 values-sw600dp-land
port
豎屏,它可以跟尺寸限定符一起使用,例如 values-sw600dp-port
類似的我們創(chuàng)建以下文件:
res/values/layouts.xml:
@layout/onepane_with_bar
false
res/values-sw600dp-land/layouts.xml:
@layout/twopanes
true
res/values-sw600dp-port/layouts.xml:
@layout/onepane
false
res/values-large-land/layouts.xml:
@layout/twopanes
true
res/values-large-port/layouts.xml:
@layout/twopanes_narrow
true
當(dāng)我需要顯示兩個面板的時候,我們在Activity 的onCreate方法中,就可以去判斷
““java
public class ArticleActivity extends FragmentActivity {
int mCatIndex, mArtIndex;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCatIndex = getIntent().getExtras().getInt("catIndex", 0);
mArtIndex = getIntent().getExtras().getInt("artIndex", 0);
//判斷我們是否需要加載雙面板
if (getResources().getBoolean(R.bool.has_two_panes)) {
finish();
return;
}
...
}
““
它的使用跟尺寸限定符類似,如果想細(xì)究請參看支持各種屏幕尺寸
使用 9Patch
相信很多人都會多少知道這個工具,它會將png的某些部分進(jìn)行拉伸,這樣我們可以使用小一些的圖片拉伸以實(shí)現(xiàn)大圖片實(shí)現(xiàn)的效果。
這個工具在/SDK 安裝目錄/sdk/tools/ 目錄下,全名叫做:draw9patch。只要雙擊既可以啟動,我們把需要拉伸的圖片直接拖進(jìn)去就OK,就像下圖:
左邊為原圖,右側(cè)為拉伸后的顯示效果;而左邊圖上的黑線是用來指示我們拉伸區(qū)域。雖然我們看來那些在圖片邊界的上的黑線很粗,其實(shí)它們只有1px,我們看到的是放大后的結(jié)果,在我們應(yīng)用中,我們是看不到的。下面我們說一下,黑色色條的作用。
黑線位置
作用
左邊和上邊
代表拉伸的區(qū)域
右邊和下邊
代表padding區(qū)域,如果這張圖作為控件的背景,如果控件需要顯示文字等內(nèi)容,則都是在右邊和下邊黑線標(biāo)出的交叉區(qū)域,它的功能就是控件的padding屬性
下圖是對應(yīng)的拉伸區(qū)域, 左側(cè)是拉伸和padding區(qū)域,右側(cè)為顯示效果:
這里指示簡單做個示例,有什么不明白的可以去問度娘或谷歌。
另外附上常見的尺寸限定符:
屏幕配置
限定符值
介紹說明
smllestWidth(最小寬度)
swdp:中間的N代表最小的寬度值,例如我們上面寫過的sw600dp,其它例子:layout-sw700dp,vaues-sw800dp
當(dāng)屏幕的最小尺寸為我們設(shè)置的N時,系統(tǒng)就會去加載帶有該后綴的文件夾下的相關(guān)的文件資源。例如:我們上面設(shè)置的layout-sw600dp,如果這個文件夾下的布局要顯示到屏幕上,那么我們的屏幕的最小尺寸在任何時候都至少是600dp,不管這個600dp是屏幕的寬還是高。也就是說 當(dāng)你所有屏幕的最小寬度都大于600dp時,屏幕就會自動到帶sw600dp后綴的資源文件里去尋找相關(guān)資源文件
可用屏幕寬度
wdp:類似上面的swdp.例如:layout-w600,values-w800
它的功能跟上面的相似。 帶這樣后綴的資源文件的資源文件制定了屏幕寬度的大于Ndp的情況下使用該資源文件,但它和swdp不同的是,當(dāng)屏幕橫向縱向切換時,屏幕的寬度是變化的,以變化后的寬度來與N相比,看是否使用此資源文件下的資源。
可用的屏幕高度
hdp:類似上面的wdp.例如:layout-h600,values-h800
這個后綴的使用方式和wdp一樣,隨著屏幕橫縱向的變化,屏幕高度也會變化,根據(jù)變化后的高度值來判斷是否使用hdp ,但這種方式很少使用,因?yàn)槠聊辉诳v向上通常能夠滾動導(dǎo)致長度變化,不像寬度那樣基本固定,因?yàn)檫@個方法靈活性不是很好,google官方文檔建議盡量少使用這種方式。
本文參考以下文章:
Android官方文檔:適配多種屏幕
總結(jié)
以上是生活随笔為你收集整理的android屏幕适配库,Android屏幕适配之布局设置(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 七骑士android版上线时间,腾讯独代
- 下一篇: 无人驾驶板块上市公司一览 都是手里有技术