> 文档中心 > 【鸿蒙应用开发系列】- 应用置灰方案实现讲解

【鸿蒙应用开发系列】- 应用置灰方案实现讲解

在某些特殊的日子里,有时候需要对应用进行一个置灰显示处理,在Android中,提供了一些很方便的方法,可以对控件或者应用进行灰色的展示

Android应用置灰方式

1、使用灰色主题皮肤(这个开发量比较大)

2、图片控件,比如ImageView的图片显示置灰, 可以使用setColorFilter 方法进行颜色饱和度设置

 

3、全局View设置置灰,在activity基类BaseActivity的onCreate方法中添加以下代码:

以上是Android侧应用置灰常见方式,那在鸿蒙应用(Java语言开发,JS或者TS开发这里不讲)中,应该怎么实现应用置灰功能呢?下面接着给大家介绍几种方式。

鸿蒙应用置灰方式

1、使用灰色主题皮肤(这个开发量比较大,这里不过多阐述)。

2、Image控件,怎么对加载的图片进行置灰处理呢,通过翻阅API,并未找到与之相关可以对Image控件设置颜色过滤的方法,但是在查阅过程中,发现PixelMapElement对象有setColorMatrix方法,而Image控件提供了一个

setImageElement方法,借此,我们这里自定义一个Image控件,提供对应的设置Colormatrix的方法,代码如下:

public class ColorMatrixImage extends Image {

    private ColorMatrix mColorMatrix;

    public ColorMatrixImage(Context context) {
        this(context, null);
    }

    public ColorMatrixImage(Context context, AttrSet attrSet) {
        this(context, attrSet, null);
    }

    public ColorMatrixImage(Context context, AttrSet attrSet, String styleName) {
        super(context, attrSet, styleName);
        init();
    }

    private void init() {
    }

    @Override
    public void setPixelMap(PixelMap pixelMap) {
        super.setPixelMap(pixelMap);
        if (mColorMatrix != null) {
            handleColorMatrix();
        }
    }

    public void setColorMatrix(ColorMatrix colorMatrix) {
        this.mColorMatrix = colorMatrix;
    }

    public void usedColorMatrix(ColorMatrix colorMatrix) {
        setColorMatrix(colorMatrix);
        handleColorMatrix();
    }

    private void handleColorMatrix() {
        PixelMapElement pixelMapElement = new PixelMapElement(getPixelMap());
        pixelMapElement.setColorMatrix(mColorMatrix);
        setImageElement(pixelMapElement);
    }

    public static ColorMatrix obtainColorMatrix(float saturation) {
        ColorMatrix colorMatrix = new ColorMatrix();
        colorMatrix.setSaturation(saturation);
        return colorMatrix;
    }
}

需要置灰的Image控件,使用该控件,就可以做到图片置灰功能,使用方法就是调用obtainColorMatrix(0),传入0 ,获取一个ColorMatrix,然后调用usedColorMatrix 置灰。

调用usedColorMatrix 前需要先调用setPixelMap将显示的图片资源设置了。

3、全局置灰功能,依旧是翻阅鸿蒙的组件API进行查找,可是依旧没有发现跟android类似的,对根视图 进行 setLayerType的方法,也找不到设置画笔Paint的方式。难受啊。

经过一顿操作尝试,终于找到了方法,灵感来自于对来自远端图片进行图片合成置灰的操作上,对画布进行处理。下面将方法提供,代码很短实现起来很简单。

  getComponentDelegate().getRootView().addDrawTask((component, canvas) ->
                canvas.drawColor(getColor(ResourceTable.Color_gray_999999), BlendMode.COLOR));

我们通过对根视图设置一个DrawTask,当视图绘制的时候,我们对其canvas,绘制一个灰色的颜色叠加上去,以此就能达到一个置灰的效果。

那怎么获取鸿蒙的根视图呢,这里需要开发者自行去维护(在创建页面视图的时候存起来),鸿蒙中未提供跟android类似的window.decorview方法。

本文结束,谢谢阅读。