android 哀悼置灰实现

339 阅读1分钟

Android 页面绘制流程一般分为 measurelayoutdraw,页面置灰在 draw 方法中实现。draw 方法参数有 canvaspaintcanvas 是界面的画布,paint 是绘制界面的画笔。可以通过更改 paint 的属性更改界面背景颜色,通过设置颜色过滤器更改画笔的色调、饱和度和亮度。

置灰效果饱和度为 0,想要恢复的话改为 1

画笔的设置代码

val view = window.decorView
val paint = Paint()
val cm = ColorMatrix()
cm.setSaturation(if (gray) 0f else 1f)
paint.colorFilter = ColorMatrixColorFilter(cm)
view.setLayerType(View.LAYER_TYPE_HARDWARE, paint)

完整代码

package com.lujianfei.kotlindemo.ui.gray.view

import android.content.Context
import android.content.Intent
import android.graphics.ColorMatrix
import android.graphics.ColorMatrixColorFilter
import android.graphics.Paint
import android.os.Bundle
import android.view.View
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.ExperimentalUnitApi
import androidx.compose.ui.unit.dp
import com.lujianfei.kotlindemo.R
import com.lujianfei.kotlindemo.base.Page


/**
 * Author: lujianfei
 * Date: 2023/12/29 15:05
 * Description:
 */

class GrayActivity:AppCompatActivity() {
    companion object {
        fun start(context: Context) {
            context.startActivity(Intent(context, GrayActivity::class.java))
        }
    }

    @OptIn(ExperimentalUnitApi::class)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Page(
                leftIcon = R.drawable.ic_back,
                onLeftClick = {
                    onBackPressed()
                },
                title = "全局变灰",
                onRightClick = {
                },
                rightText = null
            ) {
                Content()
            }
        }
    }

    @ExperimentalUnitApi
    @Composable
    @Preview(showSystemUi = true)
    fun Content() {
        val grayMode = remember { mutableStateOf(false) }
        Column(modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
            Button(modifier = Modifier.padding(top = 50.dp), onClick = {
                grayMode.value = !grayMode.value
                toggle(grayMode.value)
            }) {
                Text(text = "点击切换 ${if (!grayMode.value) "置灰" else "彩色"}")
            }
        }
    }
    private fun toggle(gray:Boolean) {
        val view = window.decorView
        val paint = Paint()
        val cm = ColorMatrix()
        cm.setSaturation(if (gray) 0f else 1f)
        paint.colorFilter = ColorMatrixColorFilter(cm)
        view.setLayerType(View.LAYER_TYPE_HARDWARE, paint)
    }
}

运行效果

switch 00_00_00-00_00_30.gif