编辑:Hukari 来源:互联网 发布时间:2021-12-13 11:16:30
今天是12月13日,很多网友发现app和网页都只呈现了黑白色,这里,我们可以简单研究下。
常用方式
App页面置灰常规方案就能想到内置两套UI图,加载不同的UI,但是这样实现起来特别复杂,而且包体积大小也成倍增加,需要请求后台服务端的图片也得搞两套。
其实换个思路,我们把Android渲染的数据统一给他灰度不就可以实现我们所需要的功能嘛,那就得看下Android的UI绘制过程了,关于UI的绘制已经有很多分析了,这里就不赘述了。
原理实现
DecorView
一个Activity由最外层的PhoneWindow,然后往里是DecorView,接着就是Titlebar和Content,其中Content就是我们在Activity中的onCreate的方法中调用的setContentView来设置布局等。
既然要设置全局的app为灰色,那么我们只要设置最顶层的view为灰色,就可以做到全局灰色了,首先想到的肯定是PhoneWindow,但是phoneWindow是一个不可见的类,而由他创建的DecorView才是我们可见的UI布局。DecorView是一个ViewGroup,继承自FragmeLayout,是UI界面的顶级容器,在事件分发中,Key和touch事件也基本上是从DecorView层层向下分发。
Paint
Android的UI绘制基本上分为measure,layout和draw,这里我们只需要看draw,他是怎么画的,实例化了Canvas对象,对canvas进行一些属性赋值,最后调用view的draw(canvas)方法去绘制。
这里还需要知道Canvas,Paint和draw是干嘛的,从字面意思其实很好理解,Canvas就像一块画布,决定了你需要在哪里画,Paint就是画笔,可以提供各种各样的样式和色彩,最后你需要拿着画笔到规定的Canvas位置中去draw。
既然决定色彩的是Paint画笔,那么我们是不是可以强制设定画笔的颜色为灰色,不就可以实现我们的需求了,然后我们发现Paint有个方法
这里再穿插一下图像的基础知识。一般我们都知道图像是由一个一个像素点组成的,而像素点是通过RGBA(红绿蓝,透明度)来控制的,这个是数字方向的。但是在我们早期的彩色电视机中,我们经常会调整彩电的色调,饱和度和亮度,其中色调就是物体的颜色,饱和度就是颜色的纯度,从0到100%来描述,亮度就是颜色的相对明暗程度。
既然饱和度为0就可以变成灰色,那么我们通过设置ColorMatrix然后给到Paint画笔不就可以了。
最终实现
我们先实现个方法:
Activity
然后我们可以在Activity的OnCreate方法中设置顶层的DecorView的画笔
setViewGray(getWindow().getDecorView());
然后我们需要的效果就出来了。
自定义dialog
如果Activity中有个按钮点击弹出dialog,此时这个dialog不属于当前Window,而是新建了一个window,相当于走了一遍Activity中创建window的流程,所以此时我们需要在其构造方法中:
以上就是本期给大家带来的咨询,更多热点新闻尽情关注ai7手游帮,每天都有新内容等着大家!