Android开发学习之路--App全局置灰

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


当有个悼念日的时候,很多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有个方法

setColorFilter(ColorFilter colorfilter);   //设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果

这里再穿插一下图像的基础知识。一般我们都知道图像是由一个一个像素点组成的,而像素点是通过RGBA(红绿蓝,透明度)来控制的,这个是数字方向的。但是在我们早期的彩色电视机中,我们经常会调整彩电的色调,饱和度和亮度,其中色调就是物体的颜色,饱和度就是颜色的纯度,从0到100%来描述,亮度就是颜色的相对明暗程度。

既然饱和度为0就可以变成灰色,那么我们通过设置ColorMatrix然后给到Paint画笔不就可以了。

最终实现

我们先实现个方法:

public void setViewGray(View view) {
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0f);
paint.setColorFilter(new ColorMatrixColorFilter(cm));
view.setLayerType(View.LAYER_TYPE_HARDWARE, paint);
}
  • Activity

然后我们可以在Activity的OnCreate方法中设置顶层的DecorView的画笔
setViewGray(getWindow().getDecorView());
然后我们需要的效果就出来了。

  • 自定义dialog

如果Activity中有个按钮点击弹出dialog,此时这个dialog不属于当前Window,而是新建了一个window,相当于走了一遍Activity中创建window的流程,所以此时我们需要在其构造方法中:

View view = LayoutInflater.from(context).inflate(R.layout.xxx, null);// 得到加载view
setViewGray(view);

​Github例子​


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: android