View繪製01-Android渲染系統中的View
Android渲染系統中的View
對於初級開發者而言,在面試中,經常會和麵試官聊到Android四大元件,聊到Activity,其中回答最純熟的一句話就是:
Activity的作用是應用與使用者之間互動的重要元件
那麼Activity
之互動功能又是怎麼實現的呢?答案不言而喻-View
我們在Activity
onCreate
的時候呼叫setContentView
方法為Activity
設定佈局,實際上就相當於對使用者開放了多個互動介面,使用者可以通過佈局中一個一個的View
進行自己想要的操作,我們也可以通過View
來向使用者展示結果資訊,那麼View
在Android渲染系統中長啥樣呢?
首先我們開啟系統的開發者選項( 通過多次點選 系統設定 > 關於本機中的版本號開啟),找到顯示佈局邊界選項並開啟(如下圖所示),
開啟後,我們可以看到介面上多了很多不同顏色的線框以及矩形蒙版,這些線框圈中的部分就代表著一個View
或者ViewGroup
,陰影部分顯示的是距父佈局的Margin
或者Padding
(如下圖所示)。
從上面兩張圖我們可以看到Android
渲染系統中以點陣為基本元素,用一個矩形區域來渲染View
,同時在這個矩形區域內響應使用者互動,從Android
渲染系統角度來看,View就是點陣裡面的一塊矩形區域。
Android原始碼中的View
不論是Java
還是Kotlin
,其語言特性就是物件導向,那麼View
作為Android
體系中的一部分,毫無疑問,它是一個物件,那麼這個物件有什麼特性呢?我們來看下官方原始碼中的說明:
This class represents the basic building block for user interface components. A View occupies a rectangular area on the screen and is responsible for drawing and event handling. View is the base class for widgets, which are used to create interactive UI components (buttons, text fields, etc.). The
{@link android.view.ViewGroup} subclass is the base class for layouts, which are invisible containers that hold other Views (or other ViewGroups) and define their layout properties.
上面這句話主要闡述瞭如下幾個要點:
View
的形狀以及作用:View
是螢幕上用於進行資料渲染展示和處理使用者事件的矩形區域,這一點我們通過第一部分渲染系統已充分認識到。View
的頂級父類特性:View
是所有元件及Layout
的直接或間接父類,這一點我們可以通過繪製各元件類繼承關係認識到(如下圖)。
看了原始碼中關於View
的定義,同學們是否對View
認識更加清晰了呢?
同學們都知道,Android
中有兩種佈局管理方式,通過Java
程式碼或者xml
佈局檔案(兩者經常組合使用,這裡我們不單獨列出),我們來看下一個典型的java
程式碼控制佈局的例子,程式碼如下圖:
這裡我們通過new
關鍵詞生成了TextView
物件,並將其設定在Activity
的佈局上,使用xml
佈局方式同樣能開啟上圖右側執行效果,但是TextView
物件又是什麼時候生成的呢?這就涉及到Android
中View
的管理-View樹,瞭解View
樹的建立過程,有利於我們更好的理解Android
中的View
管理機制,後續文章或小冊中我們將做更詳細的闡述。
Android系統座標系及View座標系
View
作為螢幕上一塊用於使用者互動和資料展示的矩形區域,那麼這塊矩形區域的渲染分工是怎麼的呢?又是怎麼確定這塊矩形區域繪製在哪裡呢?聯想數學中,我們在繪製圖形之前,首先會確立什麼?沒錯,座標系。在Android
中也有座標系的概念,與View
相關的主要有Android
螢幕座標系和View
座標系,Android
螢幕座標系用於系統確認該在什麼位置繪製多大的矩形區域以展示View
,View
座標系用於View
內部進行自我繪製時確認繪製方向和大小。
Android
螢幕座標系如下圖所示,以螢幕左上角為座標原點,向右為X
正方向,向下為Y
正方向。
View
座標系與Android
螢幕座標系類似,如下圖所示,只不過其座標原點位於View
所在矩形區域的左上角,向右為X
正向,向下為Y
正向。
從上圖中我們可以看出,所有的View
及Layout
內部的座標系均是View
座標系,同時也可以看到getTop()
,getLeft()
,getRight()
以及getBottom()
這四個函式具體所對應的距離含義。當我們在View內部進行測量繪製時,經常需要用到這四個函式,通過這四個函式我們可以手動計算該View
在介面上矩形區域的寬度和高度(注意這裡描述的是介面上矩形區域,即View
的使用者可見部分,在View
內部是沒有邊界可言的,理論上講,一個View
的內部可以無限繪製)。
可能有同學要問了,你講了View
座標系,但是我需要知道View
在螢幕座標系中的位置怎麼搞呢?也很簡單,我們可以通過View
的getBoundsOnScreen(Rect outRect)
獲取View
在螢幕上的矩形區域,那麼View
在螢幕座標系中的位置就顯而易見了。
也許有同學見過重寫onTouchListener
,自己攔截事件的操作,這種情況下我們就需要獲取當前觸控點的位置以用於判斷是否進行業務邏輯處理,具體說明如下圖:
從上圖我們可以看出getRawX()
,getRawY()
是觸控點距離螢幕座標系座標原點的距離,getX()
,getY()
是觸控點距離View
座標系座標原點的距離,通常情況下,如果是View
整體的觸屏事件處理,例如拖動View
,點選View
,我們選用getRawX()
和getRawY()
,如果是View
內部的事件處理,例如進行View
***內容***的滾動,我們選用getX()
和getY()
。
相關文章
- View的繪製二:View的繪製流程View
- View 的繪製過程View
- Android 中 View 繪製流程分析AndroidView
- View繪製——畫多大?View
- View繪製——畫在哪?View
- View 繪製流程分析View
- View繪製(一) performTraversalsViewORM
- View繪製——怎麼畫?View
- Flutter 自定義繪製 ViewFlutterView
- Android View繪製流程AndroidView
- Android View 原始碼解析(三) – View的繪製過程AndroidView原始碼
- Android View的繪製過程AndroidView
- 初·Android View的繪製流程AndroidView
- Android繪製View的過程研究——計算View的大小AndroidView
- View繪製流程原始碼分析View原始碼
- Android系統原始碼分析--View繪製流程之-inflateAndroid原始碼View
- View的繪製三:UI繪製的三大步驟ViewUI
- View的繪製-measure流程詳解View
- 初探Android的View繪製過程AndroidView
- View 繪製體系知識梳理(4) 繪製過程之 Layout 詳解View
- View 繪製體系知識梳理(5) 繪製過程之 Draw 詳解View
- flutter 自定義view 繪製曲線統計圖FlutterView
- 探究 Android View 繪製流程,Activity 的 View 如何展示到螢幕AndroidView
- View的繪製一:View是如何被新增到螢幕視窗上的View
- Android系統原始碼分析--View繪製流程之-setContentViewAndroid原始碼View
- Android系統原始碼分析–View繪製流程之-setContentViewAndroid原始碼View
- View 繪製體系知識梳理(3) 繪製流程之 Measure 詳解View
- 每日一問:簡述 View 的繪製流程View
- 自定義View的繪製流程基礎分析View
- 【Android原始碼】View的繪製流程分析Android原始碼View
- Android View 系統 1 - View樹AndroidView
- Android進階(五)View繪製流程AndroidView
- Anroid自定義View-繪製圓環View
- Android View 繪製流程(Draw) 完全解析AndroidView
- Android View繪製13問13答AndroidView
- 你需要知道的 Android View 的繪製AndroidView
- Android View繪製原理:繪製流程排程、測算等AndroidView
- 探究Android View 繪製流程,Canvas 的由來AndroidViewCanvas