You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jetpack Compose中创建通知大图标使用的圆形Bitmap

Jetpack Compose 环境生成圆形Bitmap(通知大图标可用)

以下两种方法都可以在Compose场景下快速实现转换:

方法1:基于Compose绘图API实现(纯Compose生态,无需额外依赖)

你可以直接在可组合项中通过remember缓存生成的圆形Bitmap,避免重复绘制开销:

@Composable
fun rememberCircularBitmap(sourceBitmap: Bitmap): Bitmap {
    val size = min(sourceBitmap.width, sourceBitmap.height)
    return remember(sourceBitmap) {
        // 生成正方形底图
        val outputBitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
        val composeCanvas = Canvas(outputBitmap.asImageBitmap())

        // 裁剪圆形区域绘制原图
        composeCanvas.clipPath(Path().apply {
            addOval(0f, 0f, size.toFloat(), size.toFloat())
        }) {
            drawImage(
                image = sourceBitmap.asImageBitmap(),
                // 原图居中裁剪
                topLeft = Offset(
                    (size - sourceBitmap.width) / 2f,
                    (size - sourceBitmap.height) / 2f
                )
            )
        }
        outputBitmap
    }
}

调用方式和你现有代码完全兼容:

val myBitmap = BitmapFactory.decodeResource(context.resources, R.drawable.header)
val circularNotificationBitmap = rememberCircularBitmap(myBitmap)
// 直接将circularNotificationBitmap传给通知构造的大图标参数即可

方法2:轻量原生实现(性能更高,适合不需要复用Compose绘制逻辑的场景)

如果不需要严格依赖Compose API,也可以直接用原生图形API转换,调用方式同样可以直接放在Composable代码中:

fun getCircularBitmap(source: Bitmap): Bitmap {
    val size = min(source.width, source.height)
    // 先裁剪为正方形
    val squareBitmap = Bitmap.createBitmap(
        source,
        (source.width - size) / 2,
        (source.height - size) / 2,
        size,
        size
    )
    if (squareBitmap != source) source.recycle()

    val output = Bitmap.createBitmap(size, size, source.config)
    val canvas = android.graphics.Canvas(output)
    val paint = android.graphics.Paint(Paint.ANTI_ALIAS_FLAG).apply {
        shader = BitmapShader(squareBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
    }
    canvas.drawCircle(size / 2f, size / 2f, size / 2f, paint)
    squareBitmap.recycle()
    return output
}

注意事项

  • 不需要使用的Bitmap请及时调用recycle()回收,避免内存泄漏
  • 通知大图标建议尺寸控制在256x256px以内,符合系统通知样式规范
  • 原图如果自带透明通道,生成的圆形Bitmap会自动保留透明背景

内容的提问来源于stack exchange,提问作者Raw Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:06:03