官網-View對象:https://developer.android.google.cn/reference/android/view/View.htmlhtml
public class View
extends Object
implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource
java
java.lang.Object | |
↳ | android.view.View |
Known direct subclasses AnalogClock, ImageView, KeyboardView, MediaRouteButton, ProgressBar, Space, SurfaceView, TextView, TextureView, ViewGroup, ViewStubandroid |
Known indirect subclasses AbsListView, AbsSeekBar, AbsSpinner, AbsoluteLayout, ActionMenuView, AdapterView<T extends Adapter>, AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView, AutoCompleteTextView, Button, CalendarView, CheckBox, CheckedTextView, Chronometer, and 52 others.算法 |
該類表示用戶界面組件的基本構建塊。視圖佔據屏幕上的一個矩形區域,負責繪圖和事件處理。View是小部件的基類,用於建立交互式UI組件(按鈕、文本字段等)。ViewGroup子類是佈局的基類,佈局是不可見的容器,其中包含其餘視圖(或其餘ViewGroup)並定義它們的佈局屬性。app
有關使用該類開發應用程序的用戶界面的信息,請參閱用戶界面開發人員指南。框架
窗口中的全部視圖都排列在一棵樹中。您能夠從代碼中添加視圖,也能夠經過在一個或多個XML佈局文件中指定視圖樹來添加視圖。視圖有許多專門的子類,它們充當控件,或者可以顯示文本、圖像或其餘內容。ide
一旦你建立了一個視圖樹,一般有幾種常見的操做你可能但願執行:函數
設置屬性:例如設置TextView的文本。在視圖的不一樣子類中,可用屬性和設置它們的方法會有所不一樣。注意,在構建時已知的屬性能夠在XML佈局文件中設置。佈局
設置焦點:框架將處理響應用戶輸入的移動焦點。要強制焦點到特定視圖,請調用requestFocus()。測試
設置監聽器:視圖容許客戶端設置監聽器,當視圖發生有趣的事情時,會通知監聽器。例如,全部視圖將容許您設置偵聽器,以便在視圖得到或失去焦點時獲得通知。您可使用setOnFocusChangeListener(android.view.View.OnFocusChangeListener)註冊這樣一個偵聽器。其餘視圖子類提供了更專門化的偵聽器。例如,按鈕公開偵聽器,以便在單擊按鈕時通知客戶機。
Set visibility:可使用setVisibility(int)隱藏或顯示視圖。
注意:Android框架負責測量、佈局和繪製視圖。除非實際實現了ViewGroup,不然不該該調用本身對視圖執行這些操做的方法。
要實現自定義視圖,一般首先要爲框架對全部視圖調用的一些標準方法提供覆蓋。您不須要覆蓋全部這些方法。實際上,您能夠從覆蓋onDraw(android.graphics.Canvas)開始。
Category | Methods | Description |
---|---|---|
Creation | Constructors | There is a form of the constructor that are called when the view is created from code and a form that is called when the view is inflated from a layout file. The second form should parse and apply any attributes defined in the layout file. 當從代碼中建立視圖時調用構造函數的一種形式,當從佈局文件中膨脹視圖時調用一種形式。第二種形式應該解析和應用佈局文件中定義的任何屬性。 |
|
Called after a view and all of its children has been inflated from XML. 在視圖以後調用,它的全部子視圖都從XML中膨脹。 |
|
Layout |
|
Called to determine the size requirements for this view and all of its children. 調用來肯定此視圖及其全部子視圖的大小要求。 |
|
Called when this view should assign a size and position to all of its children. 當此視圖應該爲其全部子視圖分配大小和位置時調用。 |
|
|
Called when the size of this view has changed. 當此視圖的大小更改時調用。 |
|
Drawing |
|
Called when the view should render its content. 當視圖應該呈現其內容時調用。 |
Event processing |
|
Called when a new hardware key event occurs.
|
|
Called when a hardware key up event occurs.
|
|
|
Called when a trackball motion event occurs.
|
|
|
Called when a touch screen motion event occurs. | |
Focus |
|
Called when the view gains or loses focus. 當觸摸屏運動事件發生時調用。 |
|
Called when the window containing the view gains or loses focus. 當包含視圖的窗口得到或失去焦點時調用。 |
|
Attaching |
|
Called when the view is attached to a window.
|
|
Called when the view is detached from its window. 當視圖與其窗口分離時調用 |
|
|
Called when the visibility of the window containing the view has changed. 當包含視圖的窗口的可見性發生更改時調用 |
IDs
視圖可能具備與其關聯的整數id。這些id一般在佈局XML文件中分配,用於在視圖樹中查找特定的視圖。一個常見的模式是:
在佈局文件中定義一個按鈕,併爲其分配一個唯一ID。
<Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/my_button_text"/>
從活動的onCreate方法中找到按鈕
Button myButton = findViewById(R.id.my_button);
視圖id沒必要在整個樹中都是唯一的,但最好確保它們至少在您正在搜索的樹中是唯一的。
視圖的幾何形狀是矩形的幾何形狀。視圖有一個位置,表示爲一對左側和頂部座標,還有兩個維度,表示爲寬度和高度。位置和尺寸的單位是像素。
能夠經過調用getLeft()和getTop()方法來檢索視圖的位置。前者返回表示視圖的矩形的左側或X座標。後者返回表示視圖的矩形的頂部或Y座標。這些方法都返回視圖相對於其父視圖的位置。例如,當getLeft()返回20時,這意味着視圖位於其直接父類的左邊緣的右側20個像素處。
此外,還提供了一些方便的方法來避免沒必要要的計算,即getRight()和getBottom()。這些方法返回表示視圖的矩形的右下角的座標。例如,調用getRight()相似於下面的計算:getLeft() + getWidth()(有關寬度的更多信息,請參見Size)。
視圖的大小用寬度和高度表示。視圖實際上擁有兩對寬度和高度值。
第一對被稱爲測量寬度和測量高度。這些維度定義了視圖在其父視圖內的大小(有關詳細信息,請參見佈局)。能夠經過調用getmeasure width()和getmeasure height()得到測量的維度。
第二對簡單地稱爲寬度和高度,有時也稱爲繪圖寬度和繪圖高度。這些維度定義了屏幕上視圖的實際大小,在繪圖時和佈局後。這些值可能與測量的寬度和高度不一樣,但不必定必定要不一樣。能夠經過調用getWidth()和getHeight()得到寬度和高度。
要度量它的尺寸,視圖須要考慮它的填充。填充以視圖的左、上、右和下部分的像素表示。填充能夠用特定數量的像素來偏移視圖的內容。例如,左填充2將視圖的內容推到左邊緣的右側2個像素。填充可使用setPadding(int, int, int, int)或setPaddingRelative(int, int, int, int, int)方法進行設置,並經過調用getPaddingLeft()、getPaddingTop()、getPaddingRight()、getPaddingBottom()、getPaddingStart()、getPaddingEnd()查詢。
即便視圖能夠定義填充,它也不提供對邊距的任何支持。然而,視圖組提供了這樣的支持。參考ViewGroup和ViewGroup。MarginLayoutParams獲取更多信息。
佈局是一個兩步的過程:一個度量步驟和一個佈局步驟。度量遍歷是在measure(int, int)中實現的,它是視圖樹的自頂向下遍歷。在遞歸期間,每一個視圖都將維度規範下推到樹中。在度量傳遞結束時,每一個視圖都存儲了它的度量值。第二步是佈局(int, int, int, int),也是自頂向下的。在此傳遞過程當中,每一個父進程負責使用度量傳遞中計算的大小來定位它的全部子進程。
當視圖的measure()方法返回時,必須設置它的getmeasure width()和getmeasure height()值,以及該視圖全部後代的值。視圖的測量寬度和測量高度值必須尊重視圖父視圖施加的約束。這保證了在測試結束時,全部的父母都接受他們孩子的全部測試。父視圖能夠對其子視圖屢次調用measure()。例如,父級能夠用未指定的維度度量每一個子級一次,以肯定它們想要多大,而後若是全部子級的無約束大小的和太大或過小,則用實際的數字再次調用measure()。
度量傳遞使用兩個類來傳遞維度。MeasureSpec類被視圖用來告訴它們的父母它們但願如何被度量和定位。基本LayoutParams類只描述了視圖的寬度和高度的大小。對於每一個維度,能夠指定其中一個:
an exact number,一個確切的數量
MATCH_PARENT,這意味着視圖要和其父視圖同樣大(減去填充)
WRAP_CONTENT,這意味着視圖要足夠大,以封裝其內容(加上填充)。
LayoutParams的子類用於ViewGroup的不一樣子類。例如,AbsoluteLayout有本身的LayoutParams子類,它添加X和Y值。
度量方法用於將需求從父級推到子級。一項措施能夠在三種模式之一:
UNSPECIFIED(未指定的):父視圖使用它來肯定子視圖的所需維度。例如,LinearLayout能夠調用其子視圖上的measure(),並將高度設置爲未指定的值,寬度正好爲240,以肯定子視圖的寬度爲240像素時的高度。
EXACTLY(徹底正確):這是由父類用來給子類施加一個精確的大小。孩子必須使用這個大小,並確保全部後代都符合這個大小。
AT_MOST:父進程使用它來爲子進程設置最大大小。孩子必須保證他和他全部的後代都能適應這個尺寸。
要初始化佈局,請調用requestLayout()。當一個視圖認爲is再也不適合其當前範圍時,一般會調用該方法。
Drawing(繪圖)
繪圖是經過遍歷樹並記錄須要更新的任何視圖的繪圖命令來處理的。在這以後,整個樹的繪製命令被髮送到screen,剪切到新損壞的區域。
這棵樹很大程度上是按順序記錄和繪製的,而親本則是在此以前繪製的。他們的孩子和兄弟姐妹按照他們在樹上出現的順序畫出來。若是您爲視圖設置了一個背景drawable,那麼視圖將在調用其onDraw()方法以前繪製它。可使用ViewGroup中的ViewGroup#setChildrenDrawingOrderEnabled(boolean)和視圖上的setZ(float)自定義Z值}覆蓋子繪製順序。
若要強制視圖繪圖,請調用invalidate()。
Event Handling and Threading(事件處理和線程)
視圖的基本週期以下:
事件進入並被分派到適當的視圖。視圖處理事件並通知任何偵聽器。
若是在處理事件的過程當中,視圖的邊界可能須要更改,那麼視圖將調用requestLayout()。
相似地,若是在處理事件的過程當中可能須要更改視圖的外觀,則視圖將調用invalidate()。
若是調用了requestLayout()或invalidate(),框架將根據須要度量、佈局和繪製樹。
注意:整個視圖樹是單線程的。在調用任何視圖上的任何方法時,必須始終處於UI線程上。若是您正在處理其餘線程,而且但願從該線程更新視圖的狀態,則應該使用處理程序
Focus Handling(焦點處理)
該框架將處理響應用戶輸入的常規焦點移動。這包括在視圖被刪除或隱藏時,或在新視圖可用時更改焦點。視圖代表它們願意經過isfocavailable()方法進行關注。要更改視圖是否能夠獲取焦點,請調用setfocavailable (boolean)。當處於觸摸模式(見下面的註釋)時,視圖指示他們是否仍然但願經過isFocusableInTouchMode()進行聚焦,而且能夠經過setFocusableInTouchMode(boolean)進行更改。
焦點移動是基於在給定方向上找到最近鄰居的算法。在極少數狀況下,默認算法可能與開發人員的預期行爲不匹配。在這些狀況下,您可使用佈局文件中的這些XML屬性提供顯式覆蓋:
nextFocusDown nextFocusLeft nextFocusRight nextFocusUp
要得到一個特定的視圖來獲取焦點,請調用requestFocus()。
Touch Mode(觸感模型)
當用戶經過方向鍵(如D-pad)在用戶界面中導航時,有必要將焦點放在可操做的項(如按鈕)上,這樣用戶就能夠看到須要輸入什麼。可是,若是設備具備觸摸功能,而且用戶開始經過觸摸與界面交互,則再也不須要老是突出顯示或關注特定的視圖。這激發了一種名爲「觸摸模式」的交互模式。
對於具備觸摸功能的設備,一旦用戶觸摸屏幕,設備將進入觸摸模式。從如今開始,只有isFocusableInTouchMode()爲真的視圖纔是可聚焦的,好比文本編輯小部件。其餘可觸摸的視圖,如按鈕,在觸摸時不會聚焦;它們只會觸發on click偵聽器。
每當用戶按下方向鍵,例如D-pad方向,視圖設備就會退出觸摸模式,並找到一個視圖進行對焦,這樣用戶就能夠在再也不次觸摸屏幕的狀況下繼續與用戶界面交互。
觸摸模式狀態是跨活動維護的。調用isInTouchMode()查看設備當前是否處於觸摸模式。
Scrolling(滾動)
框架爲但願在內部滾動其內容的視圖提供了基本支持。這包括跟蹤X和Y滾動偏移量以及繪製滾動條的機制。有關詳細信息,請參見scrollBy(int, int)、scrollTo(int, int)和awakenScrollBars()。