例如,如果在入职流程中,你想让屏幕的其余部分变暗,然后在屏幕的某个部分画一个光圈来突出显示聚光灯之类的东西,你会怎么做?圆需要有渐变边.它还需要至少与Jetpack Compose兼容.

这是我的try .

  1. 绘制部分透明的黑色覆盖.
  2. 使用混合模式绘制一个不带渐变边的圆以穿透叠加.清除
  3. 绘制带有渐变边缘的透明圆,使其恢复到与背景相同的 colored颜色 .
// Background content, in my real use case this would be something else
        Image(
            modifier = Modifier.matchParentSize(),
            painter = painterResource(id = R.drawable.hqdefault), contentDescription = "")

        val overlayShadeColor = Color.Black.copy(alpha = 0.8f)
        val gradient = Brush.radialGradient(
            .2f to Color.Transparent,
            .5f to overlayShadeColor)
        val radius = 120.dp

        Canvas(modifier = Modifier.fillMaxSize().graphicsLayer {
            alpha = .99f
        }) {

            // Dark overlay
            drawRect(overlayShadeColor)

            // Circle to punch through the overlay
            drawCircle(
                color = Color.White,
                radius = radius.toPx(),
                blendMode = BlendMode.Clear
            )

            // Circle that adds back a gradient edge
            drawCircle(
                gradient,
                radius = radius.toPx(),
            )
        }

It looks like this: enter image description here

我的try 的缺陷是在圆圈与背景相遇的边缘上留下了一条非常小的线(可能是1个硬件像素宽).也许画布不是正确的方法,有一种更容易的方法来做到这一点.我对建议持开放态度.

推荐答案

这个冲孔有点过头了.SRC Blend将以相同的方式工作


        drawRect(overlayShadeColor)

        drawCircle(
            gradient,
            radius = radius.toPx(),
            blendMode = BlendMode.Src
        )


Android相关问答推荐

Jetpack Compose Scaffold—content不在TopAppBar下面开始'

Kotlin Gzip字符串未按预期工作

将Android Studio插件复制到离线网络

Jetapck Compose:将Compose BOM更新为最新版本&2024.01.00&Quot;CircularProgressIndicator后出现错误

Android Studio中的Kotlin版本不兼容错误:需要元数据1.9.0,但找到1.6.0

如何制作安卓';s FileProvider在Android 11上使用外部存储+

为什么可以';我不能直接在RecyclerView.ViewHolder中访问视图ID吗?

在 Compose 中,当用户持续向下滚动时,LazyColumn 不会显示新项目

Clean MVVM 架构中的 API 响应处理

为什么我收到这个错误我需要安装 android studio

appcompat 依赖从何而来?

发布 MAUI 应用程序时出现遇到重复程序集错误

如何在 compose 中使用 BottomSheetScaffold 为底页设置半展开高度?

为什么我不能直接记住 mutableStateOf 可组合函数?

如何在 Android 应用中录制短视频?

如何在 Android 上移动 EditText 上的图标?

我的 react native 项目的发布签名 apk 没有在设备中打开,而且它创建的尺寸非常小

如何使用 Kotlin Coroutines 正确地拥有待处理的操作队列?

如何使用jetpack compose实现布局,其中图标在列布局上是绝对位置

如何获取 Android Preferences DataStore 的所有键