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

