1. 程式人生 > >UIView 的 alpha,hidden,opaque 屬性之間的關係影響 圖層混用

UIView 的 alpha,hidden,opaque 屬性之間的關係影響 圖層混用

前言

在看效能優化文章裡, 看到不少提到要把相應控制元件設定成不透明,特別是在滾動頁面上,但是沒有看到深入說明為什麼要這樣去做, 如果控制元件是透明的將會帶來什麼影響,還有當中涉及到的知識點都沒有提出來.

我們先來看這三個影響檢視顯示的屬性

alpha

顯示器是由一個個點的畫素組成,每個畫素都是由 RGBA 顏色空間來表示, alpha 即代表 A. 它是一個 CGFloat 浮點值型別, 由 0~1 範圍組成, 0表示透明, 1表示不透明.

  • 當我們設定一個 View 為透明時, 其 subView 會受其影響會直接隱藏. 不管其 Alpah值為多少.
  • 當一個 View 為透明時, 其不會具有相應功能,響應鏈會直接將事件直接傳遞到其下一個檢視。

hidden

其是一個 Bool 值. 當其設定成 No 時, 與 alpha 設定成 0 同理.

opaque

此屬性表示不透明, 一般控制元件此屬性預設都是 Yes, 即表示不透明. 但是 UIButton 子類預設是 No, 這個要注意.

如果我們將 View 的 opaque 屬性設定成 No, 並不是使其變成透明, 不知道這裡是系統對其作了一層處理還是什麼原因,總之一個 View 我們將其設定成 No 之後, 其還是正常展示, 估計這個屬性設定成No 之後還要看其 Alpha 值來進行渲染. 所以改變此屬性並不會使其變成透明.

但是這個屬性的作用是什麼呢?

圖層混用

看到2013 年的文章, 當兩個檢視相交到一起的時候, 如果將其中一個檢視此屬性改成 No, 也就是透明, 則會按照此公式來計算混合圖層 RGBA

R = S + D * ( 1 – Sa )

通過 GPU 來計算出一個 混合後的顏色值, 然後進行展示, 假如此圖層出現在滾動頁面中, 則是相對影響效能的,因為螢幕一般滾動起來會涉及到 FPS, 一旦 FPS 過低,很容易就通過肉眼看到卡頓的感覺, FPS理想狀態要保持在 60左右. 1S 刷頻 60次。

回到圖層混用, 但是現在我使用兩個相交的 View 其 opaque 屬性設定成 No, 顯出出來的圖層並沒有出現圖層混用的效果. 猜測系統已經對此屬性進行了優化,所以此屬性已經不會再造成圖層混用。

  • 為什麼會出現圖層混用,當兩個檢視相交在一起時,假如上面的檢視 alpha 值不為1,的情況下, 就會出現一個混合圖層的顏色, 因為其透明的緣故無法完全遮擋住下面的圖層, 所以 GPU 會 通過 公式去進行計算,因此有時候會相應的影響效能, 假設其值為1的話 R = S + D * (1 - 1) 則為 R = S. 即計算會很快。 未必真正計算是通過此公式。可能會更加複雜。 所以要儘量避免, 特別是在滾動檢視。

參考

最後