2014-10-02 3 views
0

Я использую несколько сотен чертежей в своем приложении для динамического отображения данных с помощью значка уведомления в строке состояния. Каждый из них представляет собой PNG, состоящий из белого текста и прозрачного фона. Я бы хотел изменить белый цвет на другой цвет в определенных ситуациях, но кажется, что должен быть лучший способ сделать это, кроме повторного создания сотен одинаковых значков разных цветов. Можно ли сделать это с помощью кода?Как динамически менять цвет значка уведомлений?

Я нашел способы изменить цвет Drawable (то есть: How to change colors of a Drawable in Android?), но не могу понять, как применить это к значку уведомления. NotifBuilder.setSmallIcon() требует int, а не Drawable.

ответ

0

Цвета НЕ должны использоваться для значков уведомлений, которые, как ожидается, не будут иметь цветов. [1]

Цветные значки могут работать на некоторых старых версиях Android, но не будут работать на новых платформах. [2]

[1] http://developer.android.com/design/style/iconography.html#notification

[2] https://developer.android.com/preview/notifications.html#guidelines, см DO и DO NOT под "Использовать различные значки" раздела

+1

Я знаком с руководством по иконографии Android и придерживался их до этого момента; пользовательский спрос диктует иначе, и я рассматриваю изменение. Я прошу технические ноу-хау, а не политику Google. Есть много популярных приложений, в которых используются цветные значки - это не обязательно правильно, но это не вопрос моего вопроса. – mike47

+1

, вероятно, мой ответ должен был быть комментарием. :) –

0

Лучше решение может быть с помощью двух различных цветов вводимого коэффициента вы желаете и соответственно изменить их.

+0

Существует около 300 различных значков .. так что сделать три цвета, это будет 900 чертежей. Я, конечно, могу это сделать, но это кажется пустой тратой ресурсов, если есть способ прагматически применить «Drawable.setColorFilter()» или что-то подобное. – mike47

-2

Попробуйте

mNotificationManager = 
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    // Sets an ID for the notification, so it can be updated 
    int notifyID = 1; 
    mNotifyBuilder = new NotificationCompat.Builder(this) 
    .setContentTitle("New Message") 
    .setContentText("You've received new messages.") 
    .setSmallIcon(R.drawable.ic_notify_status) 
    numMessages = 0; 
    // Start of a loop that processes data and then notifies the user 
    ... 
    mNotifyBuilder.setContentText(currentText) 
    .setNumber(++numMessages); 
    // Because the ID remains unchanged, the existing notification is 
    // updated. 
    mNotificationManager.notify(
    notifyID, 
    mNotifyBuilder.build()); 
    ... 

См http://developer.android.com/training/notify-user/managing.html

+0

Это просто прямая вставка примера уведомления с веб-сайта AOSP. Он вообще не отвечает на вопрос. – mike47

1

Я думаю, что она могла бы работать с LevelListDrawable в сочетании с LayerDrawable:

LevelListDrawable: Ресурс, который управляет рядом чередующихся Drawables, каждый из которых имеет максимальное числовое значение. Установка значения уровня объекта с помощью setLevel (int) будет загружать изображение со следующим большим или равным значением, назначенным его максимальному атрибуту. Хорошим примером использования LevelListDrawable будет значок индикатора уровня заряда батареи, с разными изображениями, чтобы указать текущий уровень заряда батареи.

LayerDrawable: A Drawable, который управляет массивом других Drawables. Они рисуются в порядке массива, поэтому элемент с наибольшим индексом будет нарисован сверху.

Попробуйте это:

  • LevelListDrawable XML, который содержит столько уровней, как цвета (например, уровень 1 = красный, уровень 2 = синий и т.д.)
  • каждый уровень ссылается на LayerDrawable, который содержит 2 пунктов , цвет фон первого значок PNG последнего
  • повторить для всех ваших иконок
  • при создании уведомления, установите iconLevel свойство на объекте Notification к значению, которое соот- ветствовать пруды до нужного вам цвета

У вас все еще есть много рисунков XML, но это более динамично, чем отдельный PNG для каждой комбинации значков/цветов.

+0

Интересная мысль, хотя я уже использую оба этих метода, поэтому я не уверен, что это сработает. Элемент управления «LevelListDrawable» показывает числовое значение (уровень мобильного сигнала в дБ), а «LayerDrawable» накладывает над ним надпись (тип соединения). Я также хотел изменить цвет значка, а не цвет фона, но это может привести меня в правильном направлении. – mike47

Смежные вопросы