Android屏幕元素層次結構
https://oxen.iteye.com/blog/142606
對於一個Android手機應用來說,一個好看而又簡潔的界麵,是相當重要的,既能提高使用者的體驗,又保證應用的高效執行。而Android SDK已經為我們提供了一套完善的界麵設計功能,有豐富的組件供我們使用,如果還不能滿足我們的界麵需求,我們還可以對它們進行擴展。為了達到這樣的目標,我們就要對Android
SDK中提供的界麵生成技術進行全麵深入的學習,做到應用自如。
本文參考Android提供的相關文檔,隻對Android的屏幕元素的層次結構做一個小結,從總體上對Android的界麵設計有一個把握,我想這是很有必要的。
android.app.Activity
對於一個Android應用來說,android.app.Activity類實例是一個最基本的功能單元。一個Activity實例可以做很多的事情,但是它本身無法顯示在屏幕上,而是借助於Viewgroup和View,這兩個才是Android平台上最基本的兩個用戶界麵表達單元。
android.view.ViewGroup
ViewGroup是一個特殊的View類,它繼承於android.view.View。它的功能就是裝載和管理下一層的View對象和ViewGroup對象。ViewGroup是布局管理器(layout)及view容器的基類。
ViewGroup中,還定義了一個嵌套類ViewGroup.LayoutParams。這個類定義了一個顯示對象的位置、大小等屬性,view通過LayoutParams中的這些屬性值來告訴父級,它們將如何放置。
在這裏,繼承於ViewGroup的一些主要的布局類如下:
1、FrameLayout:最簡單的一個布局對象。它裏麵隻顯示一個顯示對象。所有的顯示對象都將會固定在屏幕的左上角,不能指定位置。但允許有多個顯示對象,但後一個將會直接在前 一個之上進行覆蓋顯示,把前一個部份或全部擋住(除非後一個是透明的)。
2、LinearLayout:以單一方向對其中的顯示對象進行排列顯示,如以垂直排列顯示,則布局管理器中將隻有一列;如以水平排列顯示,則布局管理器中將隻有一行。同時,它還可以對個別的顯示對象設置顯示比例。
3、TableLayout:以擁有任意行列的表格對顯示對象進行布局,每個顯示對象被分配到各自的單元格之中,但單元格的邊框線不可見。
4、AbsoluteLayout:允許以坐標的方式,指定顯示對象的具體位置,左上角的坐標為(0, 0),向下及向右,坐標值變大。這種布局管理器由於顯示對象的位置定死了,所以在不同的設備上,有可能會出現最終的顯示效果不一致。
5、RelativeLayout:允許通過指定顯示對象相對於其它顯示對象或父級對象的相對位置來布局。如一個按鈕可以放於另一個按鈕的右邊,或者可以放在布局管理器的中央。
在Android中,提供了很多的布局管理器,這裏也不一一列舉,開發者可以根據實際需要,選擇合適的布局管理器。
android.view.View
View是所有view類的基類,一個view通常占用屏幕上的一個矩形區域,並負責繪圖及事件處理。View是所有窗體部件的基類,是為窗體部件服務的,這裏的窗體部件即UI控件,如一個按鈕或文本框。Android已經為我們提供了一係列的標準UI控件供我們直接使用,同時,我們也可以通過繼承於View類或View的子類,來實現我們自定義的UI控件。
要定製我們自己的UI控件,需要重載View類中的一些方法,以下表格列出View提供出來的,供重載的方法,這些方法不必都要重載,但至少要實現onDraw(android.graphics.Canvas)方法。
Creation | Constructors | |
onFinishInflate() |
當View和它的所有子對象從XML中導入之後,調用此方法 | |
Layout | onMeasure(int, int) |
View會調用此方法,來確認自己及所有子對象的大小 |
onLayout(boolean, int, int, int, int, int, int) |
當View要為所有子對象分配大小和位置時,調用此方法 | |
onSizeChanged(int, int, int, int) |
當View大小改變時,調用此方法 | |
Drawing | onDraw(Canvas) |
當View要繪製它的內容時,調用此方法 |
Event processing | onKeyDown(int, KeyEvent) |
當一個新的按鍵事件發生時,調用此方法 |
onKeyUp(int, KeyEvent) |
當一個按鍵釋放事件發生時,調用此方法 | |
onMotionEvent(MotionEvent) |
當一個動作事件(如觸摸)發生時,調用此方法 | |
Focus | onFocusChanged(boolean, int) |
當View獲得或失去焦點時,調用此方法 |
Attaching | onAttachedToWindow() |
當View附加到一個窗體上時,調用此方法 |
onDetachedFromWindow() |
當View離開它的窗體時,調用此方法 |
public class SendResult extends Activity { protected void onCreate(Bundle savedValues) { ... Button button = (Button)findViewById(R.id.corky); button.setOnClickListener(mCorkyListener); } private OnClickListener mCorkyListener = new OnClickListener() { public void onClick(View v) { setResult(RESULT_OK, "Corky!"); finish(); } };屏幕元素層次結構

對於Android應用中的一個屏幕,它的屏幕元素是按層次結構來描述的。要將一個屏幕元素層次樹綁定在一個屏幕上顯示,Activity會調用它的setContentView()方法並且傳入這個層次樹的根節點引用。當Activity被激活並且獲得焦點時,係統會通知activity並且 請求根節點去計算並繪製樹,根節點就會請求它的子節點去繪製它們自己。
每個樹上的ViewGroup節點會負責繪製它的子節點。ViewGroup會計算它的有效空間,布局所有的子顯示對象,並最終調用所有的子顯示對象的Draw()方法來繪製顯示對象。各個子顯示對象可以向父對象請求它們在布局中的大小和位置,但最終決定各個子顯示對象的大小和位置的是父對象。
最後更新:2017-04-02 17:28:36