Android View物件----官網翻譯
官網-View物件:https://developer.android.google.cn/reference/android/view/View.html
public class View
extends Object
implements Drawable.Callback, KeyEvent.Callback
java.lang.Object | |
↳ | android.view.View |
Known direct subclasses AnalogClock, ImageView, KeyboardView, MediaRouteButton, ProgressBar, Space, SurfaceView, TextView, |
Known indirect subclasses AbsListView, AbsSeekBar, AbsSpinner, AbsoluteLayout, ActionMenuView, AdapterView<T extends Adapter>, AdapterViewAnimator, AdapterViewFlipper, AppWidgetHostView |
該類表示使用者介面元件的基本構建塊。檢視佔據螢幕上的一個矩形區域,負責繪圖和事件處理。View是小部件的基類,用於建立互動式UI元件(按鈕、文字欄位等)。ViewGroup子類是佈局的基類,佈局是不可見的容器,其中包含其他檢視(或其他ViewGroup)並定義它們的佈局屬性。
Developer Guides
有關使用該類開發應用程式的使用者介面的資訊,請參閱使用者介面開發人員指南。
Using Views
視窗中的所有檢視都排列在一棵樹中。您可以從程式碼中新增檢視,也可以通過在一個或多個XML佈局檔案中指定檢視樹來新增檢視。檢視有許多專門的子類,它們充當控制元件,或者能夠顯示文字、影象或其他內容。
一旦你建立了一個檢視樹,通常有幾種常見的操作你可能希望執行:
設定屬性:例如設定TextView的文字。在檢視的不同子類中,可用屬性和設定它們的方法會有所不同。注意,在構建時已知的屬性可以在XML佈局檔案中設定。
設定焦點:框架將處理響應使用者輸入的移動焦點。要強制焦點到特定檢視,請呼叫requestFocus()。
設定監聽器:檢視允許客戶端設定監聽器,當檢視發生有趣的事情時,會通知監聽器。例如,所有檢視將允許您設定偵聽器,以便在檢視獲得或失去焦點時得到通知。您可以使用setOnFocusChangeListener(android.view.View.OnFocusChangeListener)註冊這樣一個偵聽器。其他檢視子類提供了更專門化的偵聽器。例如,按鈕公開偵聽器,以便在單擊按鈕時通知客戶機。
Set visibility:可以使用setVisibility(int)隱藏或顯示檢視。
注意:Android框架負責測量、佈局和繪製檢視。除非實際實現了ViewGroup,否則不應該呼叫自己對檢視執行這些操作的方法。
Implementing a Custom View(自定義檢視)
要實現自定義檢視,通常首先要為框架對所有檢視呼叫的一些標準方法提供覆蓋。您不需要覆蓋所有這些方法。實際上,您可以從覆蓋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不必在整個樹中都是惟一的,但最好確保它們至少在您正在搜尋的樹中是惟一的。
Position(配置)
檢視的幾何形狀是矩形的幾何形狀。檢視有一個位置,表示為一對左側和頂部座標,還有兩個維度,表示為寬度和高度。位置和尺寸的單位是畫素。
可以通過呼叫getLeft()和getTop()方法來檢索檢視的位置。前者返回表示檢視的矩形的左側或X座標。後者返回表示檢視的矩形的頂部或Y座標。這些方法都返回檢視相對於其父檢視的位置。例如,當getLeft()返回20時,這意味著檢視位於其直接父類的左邊緣的右側20個畫素處。
此外,還提供了一些方便的方法來避免不必要的計算,即getRight()和getBottom()。這些方法返回表示檢視的矩形的右下角的座標。例如,呼叫getRight()類似於下面的計算:getLeft() + getWidth()(有關寬度的更多資訊,請參見Size)。
Size, padding and margins
檢視的大小用寬度和高度表示。檢視實際上擁有兩對寬度和高度值。
第一對被稱為測量寬度和測量高度。這些維度定義了檢視在其父檢視內的大小(有關詳細資訊,請參見佈局)。可以通過呼叫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獲取更多資訊。
Layout(佈局)
佈局是一個兩步的過程:一個度量步驟和一個佈局步驟。度量遍歷是在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)和awakenScrollBar