如何在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
相关产品推荐
相关产品推荐

