1.概述:這裡所說的不常見只是相對於button,textView等這些非常常見的控制項而言,並不是說真的很冷爆冷門。這些控制項中有為提高效率的如merge、SurfaceView,也有為簡化代碼編寫的如GridLayout、SearchView,還有指導新式google風格的如Viewpage,ActionBar等。在此做一個總覽可按需檢取
2.merge:融合標籤,這個標籤和FrameLayout類似,只能通過重力設定布局(android:layout_gravity),所不同的是merge標籤沒有布局層。如:上面的是架構布局所形成的布局層,下面的是merge標籤形成的布局層。我們知道在布局應該勁量減少布局的深度以達到最佳化記憶體的目的,merge標籤正是這個作用。
小提示:在android xml布局檔案中開頭大寫的標籤必定有相對應的視圖類,而小寫標籤都是功能性的標籤如include、fragment。
3.RadioGroup:這其實是一個常用的控制項了。這裡提一下的原因是他繼承自線性布局,所以只能排一行,若想排兩行就得另闢蹊徑了。
4.RatingBar:評等控制項,他繼承自ProgressBar,他通過將觸摸點對於的進度值轉換成分值。
5.Switch:開關控制項,繼承自CompoundButton,有一個是否選中的狀態,其呈現有兩個部分,文字和狀態表徵圖,這些和CcheckBox都是很類似的,其中CcheckBox也是繼承自CompoundButton。
6.Space:空白控制項,就是空白的一塊。他是一個輕量級的視圖,為什嗎?分析源碼可知這個類的onDraw方法什麼也不做。所以他比設定一個invisible的控制項填充視圖空隙是要省資源的多。
7.GridLayout:格子布局,GridLayout能輕鬆搞定相對或表格布局需複雜實現的功能如計算機,metro風格的介面。你不需要設定子視圖的寬高,只需要設定他所處的位置和所跨越的格子,當然你若設定了也是有用的,其中的效果和表格布局一樣是一個“長板效應”,即最長(寬)的那個格子決定這行(列)的高(寬)。這裡提幾個主要的屬性:
android:rowCount:格子布局有幾行
android:columnCount:格子布局有幾列
android:orientation:布局方向
android:layout_column:該格子處於第幾列
android:layout_row:該格子處於第幾行
android:layout_columnSpan:該格子佔據幾列
android:layout_rowSpan:該格子佔據幾行
使用格子布局你可以用這樣的思路來使用:把格子布局想象為一個充滿布局視圖後便另起一行(列)的線性布局。
8.SearchView:搜尋控制項,其效果是一個可以收縮的控制項,也可以通過內容提供者添加搜尋曆史和搜尋建議。在googleplay的搜尋功能就是他實現的。
9.SlidingDrawer:滑動抽屜布局,有搖一搖搖出妹子後的效果,不過這個控制項已經被廢棄了,並沒有替代的控制項。他由兩個部分組成,一個是可見部分,一個是隱藏部分(屜子)。可見部分有一個按鈕叫handle點擊他可以開關抽屜。
10.TabHost:選項卡,雖然沒有廢棄,但基本上和廢棄了差不多。現在實現選項卡功能的方式不可勝計,TabHost的確無優點可言。
11.Gallery:也是一個被廢棄了的控制項,其替代控制項是viewpage。
12.VideoView、MediaController:影音顯示和控制控制項,VideoView是一個繼承自SurfaceView的控制項(關於Surface下面還會重點講下),並內建了播放功能可以簡單的實現播放功能。MediaController是一個動態建立的(不要在布局檔案中使用。因為他是浮動顯示的,像所有的影音軟體那樣碰下螢幕就在底部顯示,過段時間就自動影藏起來)並附加到一個VideoView的控制項,他有暫停,播放等功能。
13.日期和時間控制項:CalendarView日曆,Chronometer計時器,DigitalClock數字時鐘,AnalogClock鐘錶儀器。
14.ViewAnimator:動畫切換控制項,帶動畫的視圖切換控制項,繼承自FrameLayout,他有兩個動畫屬性inAnimation/outAnimation來控制進出的現實效果,每次都只能顯示一個子視圖,你可以通過addView方法添加子視圖也可以在布局檔案中添加子設圖。他的子類有ImageSwitcher,TextSwitcher,ViewSwitcher,這些子類都只能有兩個子視圖。ViewFlipper也是他的子類,可以添加多個子視圖,還可以像投影片那樣自動播放。
15.AdapterViewFlipper:帶適配器的視圖投影片,只要設定一個設配器便可像投影片那樣逐一顯示。和上面提到的ViewFlipper一樣都是可以自動播放的,當然也可以手動控制。
16.StackView:帶適配器的堆視圖,不是逐一顯示而是堆積層疊顯示。和AdapterViewFlipper一樣都繼承自AdapterViewAnimator類。
17.ViewStub:根視圖,一個按需動態顯示的控制項。通過android:layout="@layout/"預設一個布局(只能接收布局檔案且ViewStub必須置於ViewGroup內)。再用inflate方法顯示。他的優點是可以精確指定視圖的位置,他也是一個輕量級的,和Space控制項一樣他的onDraw方法也是什麼也不做。其inflate方法實現的功能是 parent.addView(),所以他的父視圖必須是ViewGroup。
18.GestureOverlayView:手勢視圖控制項,其效果如同手寫IME相似,亦可將手勢軌跡轉換為檔案。
19.:表面視圖控制項,android系統不允許非ui線程直接操作視圖,必須通過handle、非同步這樣的方式更新,但是大量的視圖更新(比如遊戲)勢必造成ui線程的堵塞。SurfaceView是一種非ui線程卻能在螢幕繪製的控制項,這樣直接操作的方式大大提高了程式的響應效率。不僅如此據說這個控制項是直接和硬體打交道的,所以速度非常之快。SurfaceView是縱深排序的,他總在所在視窗的後面顯示。如果SurfaceView的遮擋物是透明的,每次變化都會重新計算其透明效果這是影響效能的。可以通過SurfaceHolder來存取控制SurfaceView,通過getHolder方法取得SurfaceHolder,SurfaceHolder可以添加SurfaceHolder.Callback回調介面來控制SurfaceView
20.TextureView:紋理視圖控制項,用於顯示內容流,如視頻,3d動畫。和SurfaceView一樣他們都不是在ui線程繪畫的,不同的是TextureView有更多的操作,不會像SurfaceView一樣建立一個單獨的表單,其實TextureView就是繼承自View的控制項,只能用於硬體加速上。他通過TextureView.SurfaceTextureListener來擷取視圖。
21.ZoomButton/ZoomControls:縮放按鈕/縮放控制,區別是前者只可以縮或放,後者都可以。
22.TwoLineListItem:用於listview的一種特定格式,它需要兩個TextView(ID值為text1,text2),還有一個可選的第三個VIew(ID值為selectedIcon)。
23.DialerFilter:字義是撥號過濾,文檔也沒有解釋。可以通過設定setMode設定模式,主要由數字和信件兩種模式的組合。
24.其次還有ViewPage,ActionBar,PopMenu這些雖然是新控制項,但是使用的頻率已經越來越高,特別是ActionBar可以說是Google風格設計的代表。