Android开发学习之路--App全局置灰
Posted 东月之神
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发学习之路--App全局置灰相关的知识,希望对你有一定的参考价值。
当有个悼念日的时候,很多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);
以上是关于Android开发学习之路--App全局置灰的主要内容,如果未能解决你的问题,请参考以下文章
Android开发学习之路--Notification之初体验