Форум программистов, компьютерный форум CyberForum.ru

Notification с картинкой - Android

Восстановить пароль Регистрация
 
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
28.05.2014, 21:57     Notification с картинкой #1
Как рисовать во всем поле сообщения? В прямоугольнике в слайд-панели. Много раз подобное видел, но не нашел как подобное сделать... Можно пример? Или ссылку на опенсорс? Или хотя-бы в сторону каких команд искать?

Обычно там рисуют дополнительные кнопки или графики. Например график процессора во времени. Многие плееры туда добавляют кнопки - плей/пауза/стоп...

Мне мало двух строк... Но и обычной маленькой квадратной картинки вместо большой иконки (нарисовал в квадратике) мне мало...
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kvaka
 Аватар для kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
29.05.2014, 00:05     Notification с картинкой #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Самому это никогда не требовалось, но полностью кастомное уведомление сделать можно.
Вот, например цитата по этому поводу из книжки Рето Майера - дальше, думаю, поймешь куда рыть.

"Если степень детализации, которую предоставляет стандартная расширенная статусная строка, не подходит для вашего уведомления (или ее недостаточно), вы можете создать собственную разметку и назначить ее для
своего уведомления, используя класс RemoteViews.
....
Чтобы назначить данную разметку для уведомления, создайте новый
объект RemoteViews и присвойте его свойству contentView. Необходимо
также задать Ожидающее намерение свойству contentIntent.

.... далее кусок кода для примера:

Java
1
2
3
4
5
6
7
8
9
Notification notification = new Notification(R.drawable.icon,
"Custom Content",
System.currentTimeMillis());
notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
notification.contentView = new RemoteViews(this.getPackageName(),
R.layout.my_status_window_layout);
Intent intent = new Intent(this, MyActivity.class);
PendingIntent.getActivity(this, 0, intent, 0));
notification.contentIntent = pendingIntent;
"... Устанавливая значения для свойства contentView вручную, вы также
должны присвоить значение для свойства contentIntent, иначе при по-
казе уведомления будет выброшено исключение.
RemoteViews — механизм, позволяющий встраивать и управлять встро-
енными в отдельное приложение разметками. Чаще всего эти возмож-
ности применяются при создании виджетов для домашнего экрана.
Набор Представлений, которые вы можете использовать при создании
разметки, служащей параметром для конструктора RemoteViews, жестко
ограничен..."

Ну и соответственно если нужно по ходу пьессы вносить изменения:

Java
1
2
3
4
5
6
notification.contentView.setImageViewResource(R.id.status_icon,
R.drawable.icon);
notification.contentView.setTextViewText(R.id.status_text,
"Current Progress:");
notification.contentView.setProgressBar(R.id.status_progress,
100, 50, false);
Ну вроде как-то так. Это правда инфа времен 2-го андроида, может с android.support.v4.app.NotificationCompat работать нужно слегка по другому, но вектор я указал
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
29.05.2014, 03:47  [ТС]     Notification с картинкой #3
спасибо за идею... подумаю...

Добавлено через 3 часа 31 минуту
Ура! Получилось! Правда долго игрался - тяжело найти все компоненты. Похоже на рисование внутри виджета рабочего стола.

Единственное что не понял - как узнать размеры картинки до отображения... Насколько я понял размеры строки для сообщения - не фиксированая величина... Но есть целых 2 минимальных значения - с иконкой и без ("без" видел на картинке, но непонял как добиться). И с иконкой - явно фиксированная высота. Ширину планирую брать равной ширине экрана. Но как узнать ВЫСОТУ обычного сообщения? Пробовал 90, 100 (на 500 ширины) - картинка сама "растягивается" под размеры и слегка "плывет". На других мониторах будут явно другие размеры, как и при повороте экрана (ланшафт/портрет)

Согласно картинок здесь: http://developer.android.com/guide/t...fications.html

Но получилось воткнуть туда свой xml с авторазмером. несколько текстов... планирую добавить кнопки... а потом убрал все и кинул нарисованую на канвасе картинку... Вот это простор для манипуляций!
kvaka
 Аватар для kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
29.05.2014, 10:58     Notification с картинкой #4
для того чтобы узнать размеры изображени до загрузки есть такой нехитрый хак:

Java
1
2
3
4
5
6
// Получаем реальные размеры изображения
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);
        int height = options.outHeight;
    int width = options.outWidth;
с параметром inJustDecodeBounds = true сама битмапка не грузится - загружаются только сведения о ее размерах - очень полезно. Если, например твоя вьюха намного меньше чем картинка, то ты при загрузке можешь ее смасштабировать кратно 2 (т.е. уменьшить в 2, 4, 8 и т. д. раз) - очень и очень полезно для экономии памяти - вот пример:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int inSampleSize = 1;
 
            Log.e("pic", "Исходные размеры битмапки: " + width
                    + " x " + height);
            Log.e("pic", "Размеры вьюхи: " + reqWidth + " x " + reqHeight);
 
            if (height > reqHeight || width > reqWidth) {
 
                final int halfHeight = height / 2;
                final int halfWidth = width / 2;
 
                // Вычисляем максимальный коэффициент уменьшения изображения
                // (который равен степени числа 2) с учетом, что размеры
                // отмасштабированной картинки должны быть не менее, чем
                // требуемые
 
                while ((halfHeight / inSampleSize) > reqHeight
                        && (halfWidth / inSampleSize) > reqWidth) {
                    inSampleSize *= 2;
                }
BitmapFactory.Options options = new BitmapFactory.Options();            
options.inSampleSize = inSampleSize;
// Получаем сжатое изображение
            options.inJustDecodeBounds = false;
            Bitmap bitmap = BitmapFactory.decodeFile(path, options);
А вообще лучше не пытаться подстроиться под картинку в панели уведомлений, т. к. результат может быть неожиданный - например картинка будет очень высокая. задай фиксированную высоту и сделай в ImageView scaleType = centerCrop
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
29.05.2014, 15:06  [ТС]     Notification с картинкой #5
Цитата Сообщение от kvaka Посмотреть сообщение
scaleType = centerCrop
Спасибо за параметр - искал - не нашел...

Цитата Сообщение от kvaka Посмотреть сообщение
для того чтобы узнать размеры изображени до загрузки
Спасибо. Фокус класный. Возможно когда-нибудь пригодится...

Но мне нужно немного другое! Я рисую САМ, а не использую готовые картинки. Прямоугольник в слайд панели для нотиф-сообщений имеет некую высоту. Обычно стандартную. Ширина равна ширине экрана (или высоте в "боковом" режиме). Мне нужно узнать W/H до того как я буду СОЗДАВАТЬ канвас на котором нарисую свою картинку! Ме нужно знать все параметры что-бы шриф был правильным(а не сглажено-мутным), линии чоткие (1 пиксел а не 1.5) и текст не вылазил за экран(не помещается - перенесу на следующую строку).

Где-то встречал функцию получения размеров верхней панели (часов) на основе констант по версии АПИ...
Возмоно и здесь подобное.... но пока не нашел!
kvaka
 Аватар для kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
29.05.2014, 23:37     Notification с картинкой #6
Не вижу что-то проблемы - засунь подгрузку битмапки в метод onMeasure своего кастомного ImageView - так ты создашь вьюху сразу нужного размера, адаптированную под определенную картинку.
Ну и плюс - у тебя реально есть жесткая надобность рисовать самому на канвасе?
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
30.05.2014, 01:12  [ТС]     Notification с картинкой #7
Цитата Сообщение от kvaka Посмотреть сообщение
Не вижу что-то проблемы - засунь подгрузку битмапки в метод onMeasure своего кастомного ImageView - так ты создашь вьюху сразу нужного размера, адаптированную под определенную картинку.
Можно чуть подробнее? или пример? Понимаю что должен быть подобный механизм, но не понял как это сделать.

Цитата Сообщение от kvaka Посмотреть сообщение
у тебя реально есть жесткая надобность рисовать самому на канвасе?
Вопрос из серии "а почему бы и нет?". Уже нашел как большую часть проблем решить при помощи манипуляции с XML. Но вседа остается ГРАФИК - проц во времени, батарея во времени... (а если пофантазировать - то и 3Д логотип туда можно впихнуть). А на XML подобного не сделаешь!

Что приводит к новому вопросу - как обновить картинку не обновляя нотификэйшн - ведь у меня есть RemoteViews созданный при подготовке к сообщению... Может можно его повторно использовать... При обновлении нотиф оно прыгает в верх списка, когда нужно лишь сдвинуть график на картинке на пиксел.
kvaka
 Аватар для kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
30.05.2014, 02:28     Notification с картинкой #8
onMeasure - метод, который определяет размер любой вьюхи при размещении ее в разметке - погугли, там все просто.

Если же ты сам рисуешь на канвасе и вьюха у тебя полностью своя кастомная - зачем тебе вызывать обновление ее откуда-то извне. Пусть она сама себя перерисовывает - и логику, соответственно, в нее засунь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2014, 03:06     Notification с картинкой
Еще ссылки по теме:

Android Notification когда надо
Notification sound Android
Android Notification в определенное время
Android Два сервиса и Notification
Android Notification и выключенный экран

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
30.05.2014, 03:06  [ТС]     Notification с картинкой #9
Спасибо, но onMeasure - это для меня пока тяжело... Обычные кастомные вьювы я уже делал, но как его запихнуть в RemoteViews не знаю! Не уверен что моего опыта хватит!
Yandex
Объявления
30.05.2014, 03:06     Notification с картинкой
Ответ Создать тему
Опции темы

Текущее время: 08:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru