Posted on 2009-11-04 15:57
瘋狂 閱讀(906)
評論(1) 編輯 收藏 所屬分類:
android
對于一個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離開它的窗體時,調用此方法 |
以上的事件是Android自動會處理的,而對于其它一些重要的事件,如鼠標點擊等,卻必須要我們自己手動添加到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()方法來繪制顯示對象。各個子顯示對象可以向父對象請求它們在布局中的大小和位置,但最終決定各個子顯示對象的大小和位置的是父對象。
轉載地址:http://hi.baidu.com/weiyousheng/blog/item/bed1260964dd27a72fddd456.html