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

NotificationCompat.Builder大图标适配求助:如何按比例缩放Bitmap

解决通知LargeIcon的Bitmap适配问题(保持宽高比)

你的代码只是按目标高度缩放原图,得到的是窄长的Bitmap,放到192x192的通知大图标位置时,要么会被拉伸变形,要么会留大量空白,所以需要调整适配逻辑。下面提供两种常用的解决方案:

方案1:裁剪核心区域为正方形(推荐图标类图片)

这种方式会先把原图按比例放大到能覆盖192x192的尺寸,再裁剪中间的正方形部分,确保图标核心内容完整保留,不会变形。

val originalBitmap = BitmapFactory.decodeResource(resources, R.mipmap.pin_bus)
val targetSize = resources.getDimension(android.R.dimen.notification_large_icon_height).toInt()

// 计算缩放比例:取宽高缩放比例的较大值,确保缩放后能覆盖目标正方形
val scale = max(
    targetSize.toFloat() / originalBitmap.width,
    targetSize.toFloat() / originalBitmap.height
)

// 按比例缩放原图
val scaledWidth = (originalBitmap.width * scale).toInt()
val scaledHeight = (originalBitmap.height * scale).toInt()
val scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, scaledWidth, scaledHeight, true)

// 裁剪中间的192x192区域
val xOffset = (scaledWidth - targetSize) / 2
val yOffset = (scaledHeight - targetSize) / 2
val finalBitmap = Bitmap.createBitmap(scaledBitmap, xOffset, yOffset, targetSize, targetSize)

// 设置为通知大图标
notificationBuilder.setLargeIcon(finalBitmap)

// 回收不用的Bitmap,避免内存泄漏
originalBitmap.recycle()
scaledBitmap.recycle()

方案2:完整显示原图(留空白居中)

如果需要完整展示整个图标,不想裁剪,可以把缩放后的原图居中绘制到192x192的透明画布上,周围留空白。

val originalBitmap = BitmapFactory.decodeResource(resources, R.mipmap.pin_bus)
val targetSize = resources.getDimension(android.R.dimen.notification_large_icon_height).toInt()

// 计算缩放比例:取宽高缩放比例的较小值,确保整个图能放进目标正方形
val scale = min(
    targetSize.toFloat() / originalBitmap.width,
    targetSize.toFloat() / originalBitmap.height
)

// 按比例缩放原图
val scaledWidth = (originalBitmap.width * scale).toInt()
val scaledHeight = (originalBitmap.height * scale).toInt()
val scaledBitmap = Bitmap.createScaledBitmap(originalBitmap, scaledWidth, scaledHeight, true)

// 创建目标尺寸的透明Bitmap
val finalBitmap = Bitmap.createBitmap(targetSize, targetSize, Bitmap.Config.ARGB_8888)
val canvas = Canvas(finalBitmap)

// 计算居中绘制的偏移量
val xOffset = (targetSize - scaledWidth) / 2
val yOffset = (targetSize - scaledHeight) / 2

// 将缩放后的图绘制到画布中央
canvas.drawBitmap(scaledBitmap, xOffset.toFloat(), yOffset.toFloat(), null)

// 设置为通知大图标
notificationBuilder.setLargeIcon(finalBitmap)

// 回收Bitmap
originalBitmap.recycle()
scaledBitmap.recycle()

原代码问题说明

你之前的代码强制将高度缩放到目标值,宽度按比例计算后得到的是114x192的Bitmap,放到192x192的图标位置时,系统会自动填充空白区域,导致显示效果不符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:52:58