有關View與ViewGroup的講解

一、View與ViewGroup的概念

在Android APP中,**所有的用戶界面元素都是由View和ViewGroup的對象構成的。**View是繪制在屏幕上的用戶能與之交互的一個對象,它代表瞭用戶界面組件的一塊可繪制的空間塊,每一個空間塊在屏幕上占據一個長方 形區域。而ViewGroup是View的子類,同時也是 Layout 的基類,是一個用於存放其他View(和ViewGroup)對象的佈局容器。因此,View的行為特征ViewGroup也具備,但同時因為 ViewGroup 是Layout的祖先,所以具備的一些其它特點是View所不具有的。

Android為我們提供瞭一個View和ViewGroup子類的集合,集合中提供瞭一些常用的輸入控件(比如按鈕和文本域)和各種各樣的佈局模式(比如線性或相對佈局)。

二、View與ViewGroup有什麼區別

Android 應用中的所有用戶界面元素都是使用 View 和 ViewGroup 對象構建而成。View 對象用於在屏幕上繪制可供用戶交互的內容。ViewGroup 對象用於儲存其他 View(和 ViewGroup)對象,以便定義界面的佈局。其中,View是所有UI組件的基類,而 ViewGroup是容納這些組件的容器,其本身也是從View派生出來的。

View對象是Android平臺中用戶界面體現的基礎單位,它是用來創建交互性的UI組件(如:按鈕文本框等等)的widgets的父類。它們提供瞭諸如文本輸入框和按鈕之類的UI對象的完整實。

ViewGroup繼承自View,是一種特殊的View,它可以裝其他的Views(或其他的ViewGroup)。ViewGroup是佈局(layouts)和views containers的父類。它的直接子類有: FrameLayout、GridLayout、LinearLayout等等。

一般來說,開發Android應用程序的UI界面都不會直接使用View和ViewGroup,而是使用這兩大基類的派生類,我們隻需定義內容,並使用這些 UI 組件均擁有的一組唯一的 API即可,然後進行一些基本的操作,比如:

– 設置屬性,如長、寬、著色等

這些屬性的設置通常可以用代碼實現,也可以用XML文件。並用這些屬性在運行時候也可以通常方法進行修改。

– 請求焦點,可以通過函數實現焦點轉換

不同的焦點可以實現不同的背景變換等功能,焦點在Android裡分為幾種情況,一種是可以獲取焦點,另外一種是不能獲取焦點,第三種是可獲取焦點,但發生在觸摸狀態下。

– 設置事件監聽者

所有的View都會在本身發生變化將自身的信息廣播出去。比喻點擊、焦點失去得到等。通常一個事件來到,Android會將事件傳 遞到相應的View,然後View將事件傳遞到相應的Listeners。這時View需要獲取焦點,如果需要重新繪制View的話,需要調用 invalidate(0或者reqeustLayout重新繪制整個界面。

– 設置顯示與隱藏,還可以對其內容設置scrolling

下面列出View和ViewGroup的直接子類和派生子類

View派生出的直接子類有

ImageView,ProgressBar,TextView,ViewGroup,AnalogClock,KeyboardView,ViewStub,SurfaceView; View派生出的間接子類有

Button,CheckBox,AbsoluteLayout,AdapterView,AdapterViewAnimator,AdapterViewFlipper,AppWidgetHostView,AutoCompleteTextView,CalendarView,CheckedTextView,Chronometer,AbsListView,AbsSeekBar,AbsSpinner,CompoundButton; ViewGroup派生出的直接子類有

AbsoluteLayout,FrameLayout,LinearLayout,RelativeLayout,AdapterView,FragmentBreadCrumbs,SlidingDrawer; ViewGroup派生出的間接子類有

ListView,GridView,AbsListView,AbsSpinner,AdapterViewAnimator,AdapterViewFlipper,AppWidgetHostView,CalendarView,DatePicker,DialerFilter,ExpandableListView,Gallery,GestureOverlayView,HorizontalScrollView,ImageSwitcher;

**這裡特別指出:**ImageView是佈局具有圖片效果的UI常用的類,SurfaceView是用來進行遊戲開發的與一般View相比較為特殊的非常重要的類,而AbsoluteLayout、 FrameLayout、LinearLayout、RelativeLayout這幾個ViewGroup的直接子類是Android UI佈局中最基本的佈局元素。

三、自定義View和ViewGroup一些常用的方法

1、為什麼要自定義View和ViewGroup?

在日常的Android開發中會經常和控件打交道,很多時候會遇到系統框架中提供的控件無法滿足我們產品的設計需求,那麼怎麼辦呢?

這時候我們可以選擇先Google下有沒有比較成熟的開源項目可以讓我們用,當然現在Github上面的項目非常豐富,能夠滿足我們絕不多數的開發需求,但是在使用這些炫酷的第三方控件時還不能滿足我們更細致的定制要求要怎麼辦呢?這時我們就要發揮自己的想象力,動手實現自己想要的控件。

這節我們主要討論View和ViewGroup的是什麼以及他們之間的關系,所以對於自動能夠已控件我們隻做出簡單的常用方法介紹,以此讓大傢有個直觀的感性的認識,而更多的關於自定義控件(自定義View和ViewGroup)的內容會在之後的文章中詳細介紹。

2、常用方法如下:

protected void onDraw(Canvas canvas)

View類中用於重繪的方法,這個方法是所有View、ViewGroup及其派生類都具有的方法,也是Android UI繪制最重要的方法。開發者可重載該方法,並在重載的方法內部基於參數canvas繪制自己的各種圖形、圖像效果。 protected void onLayout(boolean changed, int left, int top, int right, int bottom)

View類中佈局發生改變時會調用的方法,這個方法是所有View、ViewGroup及其派生類都具有的方法,重載該類可以在佈局發生改變時作定制處理,這在實現一些特效時非常有用。 protected void dispatchDraw(Canvas canvas)

ViewGroup類及其派生類具有的方法,這個方法主要用於控制子View的繪制分發,重載該方法可改變子View的繪制,進而實現一些復雜的視效。 protected boolean drawChild(Canvas canvas, View child, long drawingTime))

ViewGroup類及其派生類具有的方法,這個方法直接控制繪制某具體的子view,重載該方法可控制具體某個具體子View。

You May Also Like