大型通知图标背景

26
自从Android 5.0推出后,通知中的大图标有颜色背景:

lollipop-notification

对于小图标,它是通知的强调颜色(Notification.Builder.setColor(int))。那么如何设置大图标的颜色呢?它是否是实际图像的一部分?如果是,圆形半径应该是多少?
3个回答

33

是的,大图标的颜色是实际图片的一部分。Lollipop上大图标的尺寸为40x40dp,光学视图填充整个图像。因此,您应该创建一个带有20dp半径圆形的40x40dp资产。 您可以按以下方式设置通知的大图标:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
    .setSmallIcon(R.drawable.notification_small_icon)
    .setLargeIcon(notificationLargeIconBitmap)
    .setContentTitle("Notification")
    .setContentText("Content text")
    .setColor(context.getResources().getColor(R.color.accent_color));

如果您需要使用drawable资源来获取大图标,可以像这样获取 Bitmap 实例:

Bitmap notificationLargeIconBitmap = BitmapFactory.decodeResource(
    context.getResources(), 
    R.drawable.notification_large_icon);

如果你想让你的通知在之前的安卓版本(kitkat 及以下)中以优美的方式显示,那么你需要拥有一个尺寸为64x64dp 的方形大图标。


大图标的尺寸在KitKat及以下版本实际上是64x64dp,但在Lollipop上为40x40dp。不过我无法找到我找到这些信息的来源。 - alxscms
1
这很奇怪,因为通知中显示的实际图像肯定是40x40dp。这是否意味着Android将其放大到64x64dp,然后缩小为40x40dp?多么奇怪的过程。我需要一些时间来检查一下。 - alxscms
我不得不使用96dp的正方形来在我的Lollipop设备上获得非模糊图像。 - Casey
我认为你混淆了dp和px值。dp代表设备独立像素,而px表示显示器上的实际像素。通知图标为24dp x 24dp(即20dpx20dp的内容区域)。根据设备的屏幕密度,这会导致2x、3x或0.75x等实际像素值。另请参见:http://developer.android.com/design/style/iconography.html或http://www.google.com/design/spec/style/icons.html#icons-system-icons - Erik
我尝试过了,但仍然只显示白色方块图标,请有人提供正确的、对于5.0以上版本和prelollipop都适用的一些有帮助的代码。 - Harsha
显示剩余3条评论

1
你可以使用透明背景的图标作为通知的大图标。同时,你也可以对大、小图标进行着色。
如前所述,使用setColor()函数来对小图标进行着色。
对于大图标,可以使用以下函数:
fun Bitmap.tint(color: Int): Bitmap =
    Bitmap.createBitmap(this.width, this.height, Bitmap.Config.ARGB_8888).also { outBmp ->
        Canvas(outBmp).drawBitmap(
            this, 0f, 0f,
            Paint().apply {
                this.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)
            }
        )
    }

所以你的代码将会是这样的:
    NotificationCompat.Builder(context)
        .setColor(yourColor)
        .setLargeIcon(largeBitmap.tint(yourColor))
        .setSmallIcon(R.drawable.small_icon)

以下是Android 5.0的功能: 在此输入图像描述 而在Android 10中: 在此输入图像描述


0

一个大图标应该始终有一个背景(即头像)。它还用作穿戴设备上通知的背景。它显示在不同的背景颜色上,因此应该是一张非透明的图片。


不应该。如果您需要一个适用于可穿戴设备的平方资源,可以为不同的设备拥有多个版本相同的资源。 - alxscms
当然可以,但这样做会增加很多不必要的开销。如果你有动态图标,那么在它被显示为圆形遮罩时再额外处理它就更加浪费资源了。保持简单。 - notz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接