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. 即计算会很快。 未必真正计算是通过此公式。可能会更加复杂。
    所以要尽量避免, 特别是在滚动视图。

参考

UIKit性能调优实战讲解

最后

希望此篇文章对您有所帮助,如有不对的地方,希望大家能留言指出纠正。
谢谢!!!!!
学习的路上,与君共勉!!!

本文原创作者:Jersey. 欢迎转载,请注明出处和本文链接

目录
相关文章
|
6月前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
layer根据内容动态改变窗口高度
layer根据内容动态改变窗口高度
174 0
|
前端开发 JavaScript
echarts tooltip设置正常却无法显示被遮挡设置层级堆叠顺序的问题解决方案
echarts tooltip设置正常却无法显示被遮挡设置层级堆叠顺序的问题解决方案
548 0
|
JavaScript 前端开发
JavaScript动画函数增加属性,函数,层级,透明度的封装
JavaScript动画函数增加属性,函数,层级,透明度的封装
110 0
JavaScript动画函数增加属性,函数,层级,透明度的封装
关于 操作COM组件的RGB属性只能传递一个int表达COM三色属性rgb 的解决方法
关于 操作COM组件的RGB属性只能传递一个int表达COM三色属性rgb 的解决方法
关于 操作COM组件的RGB属性只能传递一个int表达COM三色属性rgb 的解决方法
|
vr&ar Android开发
【Android 应用开发】Paint 图形组合 Xfermod 之 合成模式表示方法 ( Xfermod 使用步骤 | 透明度 颜色值 公式表示方法 | 老版本表示方法 | 合成区域分块 )
【Android 应用开发】Paint 图形组合 Xfermod 之 合成模式表示方法 ( Xfermod 使用步骤 | 透明度 颜色值 公式表示方法 | 老版本表示方法 | 合成区域分块 )
223 0
【Android 应用开发】Paint 图形组合 Xfermod 之 合成模式表示方法 ( Xfermod 使用步骤 | 透明度 颜色值 公式表示方法 | 老版本表示方法 | 合成区域分块 )
【约束布局】ConstraintLayout 之 Chains 链式约束 ( Chains 简介 | 代码 及 布局分析 | 链头设置 | 间距设置 | 风格设置 | 权重设置 )(一)
【约束布局】ConstraintLayout 之 Chains 链式约束 ( Chains 简介 | 代码 及 布局分析 | 链头设置 | 间距设置 | 风格设置 | 权重设置 )(一)
319 0
【约束布局】ConstraintLayout 之 Chains 链式约束 ( Chains 简介 | 代码 及 布局分析 | 链头设置 | 间距设置 | 风格设置 | 权重设置 )(一)
【约束布局】ConstraintLayout 之 Chains 链式约束 ( Chains 简介 | 代码 及 布局分析 | 链头设置 | 间距设置 | 风格设置 | 权重设置 )(三)
【约束布局】ConstraintLayout 之 Chains 链式约束 ( Chains 简介 | 代码 及 布局分析 | 链头设置 | 间距设置 | 风格设置 | 权重设置 )(三)
376 0
【约束布局】ConstraintLayout 之 Chains 链式约束 ( Chains 简介 | 代码 及 布局分析 | 链头设置 | 间距设置 | 风格设置 | 权重设置 )(三)
【约束布局】ConstraintLayout 之 Chains 链式约束 ( Chains 简介 | 代码 及 布局分析 | 链头设置 | 间距设置 | 风格设置 | 权重设置 )(二)
【约束布局】ConstraintLayout 之 Chains 链式约束 ( Chains 简介 | 代码 及 布局分析 | 链头设置 | 间距设置 | 风格设置 | 权重设置 )(二)
1144 0
【约束布局】ConstraintLayout 之 Chains 链式约束 ( Chains 简介 | 代码 及 布局分析 | 链头设置 | 间距设置 | 风格设置 | 权重设置 )(二)