標籤:idt 做了 引入 name 定義 通過 graphic 詳細 object
View,幾乎是所有介面系統中的基類,在iOS裡面是UIView,在Android裡是View。 那麼,到底View是什麼東西,他做了些什麼,他是怎麼做到的,在這篇文章中,希望能帶給大家一些啟發。
抽象
View實際上是一個抽象類別,他負責對渲染、布局以及觸摸事件進行抽象。
渲染抽象
我們知道,不管是 iOS 還是 Android,他們的渲染引擎都是 OpenGL,OpenGL是面向C語言的(當然,在Objective-C和Java中都有封裝)。而作為前端開發人員,要直接使用OpenGL編寫介面,真是不(Tai)現(Nan)實(Le)。於是,我們有了介面庫,這種介面庫,在iOS上,我們稱之為UIKit,在Android上,我們使用android.view.*包。不管是iOS還是Android,介面庫要做的事情,目標都是一致的,那就是將介面渲染從具體變成抽象。
布局抽象
布局,是View最重要的特性,諸如層級控制、矩形大小、Matrix變換都屬於布局抽象的範疇,布局是渲染、觸摸兩者的基礎,缺少布局,渲染和觸摸便無法繼續。
觸摸事件抽象
除了渲染、布局以外,View還需要承擔另外一個職責————觸控。所謂觸控,有觸才有控,一方面View要負責接收觸摸事件,另一方面View要負責反饋接收到的觸摸事件,至於具體的觸控實現,下文會詳細描述。
渲染
一般來說View不會直接面向OpenGL進行封裝,而是通過中介層,在iOS上,使用的是CALayer(CoreGraphics),而在Android上,使用的是 Canvas(Skia)。
iOS
在iOS上,每個UIView都會有一個相對應的CALayer,我們稱之為Layer-Back,也就是說,所有的UIView屬性,最終,都會設定到CALayer身上。
為什麼要使用CALayer這個中介層呢?很重要的一點是,CoreGraphcis架構,這個架構,在NEXT系統建立之初就存在了,並且是整個macOS系統的核心架構。這麼6的架構,為毛不讓他移植到iOS上呢?於是,CALayer就順理成章地成為了UIView背後的賢內助。UIView會將以下屬性proxy到CALayer上
alpha
frame
backgroundColor
clipsToBounds
hidden
為毛這麼少屬性?嗯,因為其它屬性需要你自己去設定到CALayer上。什嗎?你要問CALayer是怎麼渲染到螢幕上的?你自己查吧,據說,專門有一本書是寫這個的。總的來說,UIView在渲染上,並沒有做什麼神奇的事情,CALayer才是一直默默耕耘的那個。
Android
Android實際上是個草根系統,出生的時候,並沒有一個有錢的爸爸…所以呢? Android View的渲染層,其實是照抄H5中的Canvas。
比如,我要在 View 上畫一個黑色的 backgroundColor,實際上會在 void onDraw(Canvas canvas)
方法中執行以下代碼。
又例如,我想要讓View有圓角裁剪的效果,怎麼辦呢?實際上,會這麼做。
醬紫,在這個View中所繪製的所有圖案(包括子View)都會被某個路徑裁剪掉。
那麼,View幹了啥? View實際上會定義好x, y, width, height只有知道這些參數,你才能畫出一個背景色,不然……你畫個卵?View還管理著 alpha/backgroundColor等屬性,這些屬性,你都能在Canvas、Paint類中找到相關的參數。
iOS VS Android
這個,沒什麼好對比的,無非就是渲染層的抽象不一樣而已。就渲染效能而言,iOS是更勝一籌的,自Android 4.x引入Skia以後,特別是Skia在 Google黃油計劃以後,Android的渲染效能也差不了去哪裡了。如果,你要死摳對比的話,我只能說一個是CALayer,一個是Canvas,CALayer更抽象而已了。
78486699
我所理解的Android和iOS上的View