/**********************2016年4月23日 更新*******************************/android
知乎:爲什麼Android的默認佈局是RelativeLayout?而不是LinearLayoutapp
不管是Eclipse仍是Android Studio,新建Blank Activity時默認的layout都是RelativeLayout,佈局
查詢資料發現這是由性能
android-sdk\tools\templates\activities\BlankActivity\root\res\layout\activity_simple.xml.ftl 這個文件定義的,也就是說這是Google的選擇,而非IDE的選擇。測試
我想知道的是爲何是RelativeLayout而不是LinearLayout?若是有可靠的數據支持的話再好不過,先謝過。字體
貓叔:優化
Google的意思是「性能至上」, RelativeLayout 在性能上更好,由於在諸如 ListView 等控件中,使用 LinearLayout 容易產生多層嵌套的佈局結構,這在性能上是很差的。而 RelativeLayout 因其原理上的靈活性,一般層級結構都比較扁平,不少使用LinearLayout 的狀況均可以用一個 RelativeLayout 來替代,以下降佈局的嵌套層級,優化性能。因此從這一點來看,Google比較推薦開發者使用RelativeLayout,所以就將其做爲Blank Activity的默認佈局了。spa
李板溪:設計
你能夠去看 Google I/O 中 Android 的 Session3d
或者 Android 的文檔。
不過基本能夠總結成如下3點:
1. RelativeLayout 佈局靈活一些。
2. 實現複雜的佈局時,因爲 RelativeLayout 所須要的嵌套層次少,因此可能大概也許性能會好一些。 可是你應該根據實際狀況測試,主觀判斷不許確,請參考下面第三點。
3. 對於簡單的佈局,或者使用 LinearLayout 的嵌套佈局層次很少的狀況下。仍是推薦 使用 LinearLayout 來實現。 由於 LinearLayout 佈局性能更高一點,爲何? 由於 RelativeLayout 佈局須要至少計算兩次。
知乎:px、dp、dip、dpi、sp 等到底有什麼聯繫區別?產生的根源和設計時的影響如何?是否屏幕密度的決定緣由?
王拓翔:
從UI設計師的角度理解:
px(像素)是咱們UI設計師在PS裏使用的(不解釋),同時也是手機屏幕上所顯示的(也不解釋)
dp是開發寫layout的時候使用的尺寸單位,sp是開發寫layout時關於字體的字號單位,且dp與sp總爲1:1關係。
Android支持四種不一樣的dpi模式:ldpi mdpi hdpi xhdpi
通常地,手機分辨率與所運行的dpi模式是匹配的,例如hvga(320x480像素)的手機屏幕通常在3.5英寸左右,運行在mdpi模式下(也有例外,稍後解釋)(這個是ROM控制的,app不能改變)。當運行在mdpi下時,1dp=1px:也就是說設計師在PS裏定義一個item高48px,開發就會定義該item高48dp;Photoshop中14px大的字體,開發會定義爲14sp。
對於一部wvga(480x800)手機(G七、N一、NS),通常是運行在hdpi模式下。當運行在hdpi模式下時,1dp=1.5px:也就是說設計師在PS裏定義一個item高72px,開發就會定義該item高48dp;Photoshop中21px大的字體,開發會定義爲14sp。
因此,當你的app須要適配多個dpi模式的時候(例如同時適配mdpi與hdpi),若你在wvga下作設計,你須要將你的各數值都爲3的倍數,並在切圖標註時將全部的數字除以3乘以2換算成dp,這樣開發的同一套layout就能用在兩個不一樣的dpi模式下,而不是寫兩套layout。
mdpi與hdpi是2:3的關係
mdpi與xhdpi是1:2的關係
ldpi與mdpi是3:4的關係
Galaxy Nexus 是720P屏幕,就是運行在xhdpi下的。
能夠想見爲何iOS的開發者升級到 Retina Display 是多麼的無痛
再補充一種例外,有些比較山寨的Pad有多是7英寸屏幕,分辨率爲wvga(480x800)運行在mdpi下,因此一部wvga手機是320x533dp,一部wvga平板是480x800dp,能夠顯示的內容會多不少。
/********************************************************************/
相對佈局通常就是控制控件與控件之間的相對位置來定位,若是不設置都是默認以屏幕的左上角的對齊
常見: 位置,對齊
layout_blow 在某控件的下面 layout_above 在某控件的上面
Layout_toRightOf 在某控件的右面 layout_toLeftOf 在某控件的左面
Layout_centerInParent 在父控件的中央
Layout_centerHorizontal 在父控件水平方向劇中
Layout_centerVerital 在父控件垂直方向劇中
與同級別對齊,與父控件對齊
Layout_alignRight 與某控件右邊對齊
Layout_alignParentBottom 與父控件底部對齊
Layout_marginLeft layout_marginTop 頁邊距
Layout_textColor=」#66000000」 支持透明度 argb第一個是透明度
單位:
dp==dip 單位像素密度,在不一樣分辨率的手機上會自動進行變化,比例顯示一致
px 在不一樣分辨率的手機上會顯示一致,所以有時會感受app的比例不對
sp 實際所表明的大小和dp一致,爲了對文字縮放防止鋸齒特地制定
測試代碼
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="80dp" tools:context="com.tsh.commonlayout.MainActivity" > <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25sp" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:text="我是大文本" /> <TextView android:layout_below="@id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#66000000" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:text="我是小文本" /> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_alignParentRight="true" /> </RelativeLayout>