Опубликован: 22.12.2015 | Уровень: для всех | Доступ: платный
Лекция 5:

Использование уведомлений

< Лекция 4 || Лекция 5 || Лекция 6 >

Определение времени уведомление

Используйте уведомления в те случаях, когда вы хотите передать пользователю новые сообщения. Сообщения могут исчезать через определенное время или создавать элементы управления, похожие на кнопки. Вы можете блокировать события пользовательского интерфейса и отображать сообщения в нижней части экрана.

Создайте новый проект ‘NotifyEx’. Внесите изменения в начале файла исходного кода.

typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
//Evas_Object *label;
Evas_Object *box;
Evas_Object *frame;
} appdata_s;

Добавьте код в функции create_base_gui() function. Этот код создает Frame, контейнер Box, кнопку и объект Notify.

/* Conformant */
ad->conform = elm_conformant_add(ad->win);
elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_win_resize_object_add(ad->win, ad->conform);
evas_object_show(ad->conform);

/* Frame for padding */
ad->frame = elm_frame_add(ad->win);
elm_object_style_set(ad->frame, "pad_large");
evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(ad->conform, ad->frame);
evas_object_show(ad->frame);
{
/* Vertical box */
ad->box = elm_box_add(ad->conform);
elm_box_padding_set(ad->box, ELM_SCALE_SIZE(20), ELM_SCALE_SIZE(20));
evas_object_size_hint_weight_set(ad->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(ad->box, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_content_set(ad->frame, ad->box);
evas_object_show(ad->box);
Evas_Object *notify = create_notify_top_timeout(ad);
/* Button-1 */
Evas_Object *btn = elm_button_add(ad->win);
elm_object_text_set(btn, "Top / Time out");
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.0);
evas_object_smart_callback_add(btn, "clicked", btn_click_cb, notify);
elm_box_pack_end(ad->box, btn);
evas_object_show(btn);
}
/* Show window after base gui is set up */
evas_object_show(ad->win);
}

Функция create_notify_top_timeout() создает объект Notify и определяет время уведомления. Создайте функцию выше create_base_gui().

static Evas_Object*
create_notify_top_timeout(appdata_s *ad)
{
Evas_Object *notify;
Evas_Object *label;
const char *msg ="<align=center>This notification will hide automatically in 3 second s later.</>";
/* Create notify (top-aligned / hide automatically) */
notify = elm_notify_add(ad->frame);
elm_notify_align_set(notify, EVAS_HINT_FILL, 0.0);
elm_notify_timeout_set(notify, 3.0);
/* Create label for notify message */
label = elm_label_add(notify);
evas_object_size_hint_weight_set(label, 1.0, 0.0);
evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_label_line_wrap_set(label, ELM_WRAP_WORD);
elm_object_text_set(label, msg);
elm_object_content_set(notify, label);
evas_object_show(label);
/* We do NOT show the notify yet */
return notify;
}

static void
btn_click_cb(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *notify = data;
/* Raise object, i.e. place it above all other objects,
* as it was created before some other objects (buttons).
*/
evas_object_raise(notify);
evas_object_show(notify);
}

elm_notify_add(Evas_Object *) - это API, который создает объект Notify.

elm_notify_align_set(Evas_Object *, double, double) - это API, который задает положение объекта Notify и соотношение его сторон. Второй параметр — положение по горизонтали (0 — слева, 0,5 — в центре, 1 — справа). Третий параметр — положение по вертикали (0 — сверху, 0,5 — в центре, 1 — снизу).

elm_notify_timeout_set(Evas_Object *, double) - это API, который определяет время отображения уведомления в секундах.

Запустите пример. Убедитесь, что сообщение отображается три секунды.


Масштабирование уведомления

Иногда текст в уведомлении отображается в урезанном виде. Мы попытаемся решить эту проблему за счет изменения масштаба приложения. Добавьте код в функцию app_create().

static bool
app_create(void *data)
{
appdata_s *ad = data;
elm_app_base_scale_set(1.8);
create_base_gui(ad);
return true;
}

elm_app_base_scale_set(double) - это API, который изменит масштаб приложения. Масштаб по умолчанию равен единице. При увеличении масштаба область уведомления становится меньше. Запустите пример. Убедитесь, что приложение работает корректно.


Добавление кнопки к уведомлению

Теперь мы добавим кнопку к уведомлению, что позволит исчезать уведомлению вместо того, чтобы ждать определенный временной промежуток. Добавьте код в функцию create_base_gui().

/* Button-1 */
Evas_Object *btn = elm_button_add(ad->win);
elm_object_text_set(btn, "Top / Time out");
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.0);
evas_object_smart_callback_add(btn, "clicked", btn_click_cb, notify);
elm_box_pack_end(ad->box, btn);
evas_object_show(btn);

notify = create_notify_top_manual(ad);

/* Button-2 */
btn = elm_button_add(ad->win);
elm_object_text_set(btn, "Top / Manual");
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.0);
evas_object_smart_callback_add(btn, "clicked", btn_click_cb, notify);
elm_box_pack_end(ad->box, btn);
evas_object_show(btn);
}

Этот код создает второй объект Notify и вторую кнопку. Добавьте две функции выше create_base_gui() .

static void
btn_hide_notify_cb(void *data, Evas_Object *obj, void *event_info)
{
Evas_Object *notify = data;
evas_object_hide(notify);
}
static Evas_Object*
create_notify_top_manual(appdata_s *ad)
{
Evas_Object *notify;
Evas_Object *box;
Evas_Object *label;
Evas_Object *btn;
const char *msg =
"<align=center>Click OK to hide this notification.</>";
/* Create notify (top-aligned / hide manually) */
notify = elm_notify_add(ad->frame);
elm_notify_align_set(notify, EVAS_HINT_FILL, 0.0);
elm_notify_timeout_set(notify, 0.0);
/* Create box for stacking notify message and button vertically */
box = elm_box_add(notify);
evas_object_show(box);
/* Create label for notify message */
label = elm_label_add(box);
evas_object_size_hint_weight_set(label, 1.0, 0.0);
evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_label_line_wrap_set(label, ELM_WRAP_WORD);
elm_object_text_set(label, msg);
elm_box_pack_end(box, label);
evas_object_show(label);
/* Create button to hide notify */
btn = elm_button_add(box);
elm_object_text_set(btn, "OK");
evas_object_size_hint_weight_set(btn, 1.0, 0.0);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_box_pack_end(box, btn);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked", btn_hide_notify_cb, notify);
elm_object_content_set(notify, box);
/* We do NOT show the notify yet */
return notify;
}

Функция btn_hide_notify_cb() скрывает уведомление. Нажатие на кнопку, вызванную уведомлением, вызывает эту функцию.

Функция create_notify_top_manual() создает второй объект Notify. Этот код создает контейнер Box в уведомлении, а также метку и кнопку в контейнере Box. Запустите пример снова и нажмите на вторую кнопку. Появится уведомление, и вы сможете увидеть, что метка и кнопка были добавлены. Нажатие на кнопку приведет к исчезновению уведомления.


Уведомление для блокирующих событий

Теперь мы реализуем возможность блокирования пользовательских событий при отображении уведомления. Добавьте код в функцию create_base_gui().

/* Button-2 */
btn = elm_button_add(ad->win);
elm_object_text_set(btn, "Top / Manual");
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.0);
evas_object_smart_callback_add(btn, "clicked", btn_click_cb, notify);
elm_box_pack_end(ad->box, btn);
evas_object_show(btn);

notify = create_notify_top_block(ad);

/* Button-3 */
btn = elm_button_add(ad->win);
elm_object_text_set(btn, "Top / Block");
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.0);
evas_object_smart_callback_add(btn, "clicked", btn_click_cb, notify);
elm_box_pack_end(ad->box, btn);
evas_object_show(btn);
}

Этот код создает третье уведомление и третью кнопку. Создайте новую функцию выше create_base_gui() .

static Evas_Object*
create_notify_top_block(appdata_s *ad)
{
Evas_Object *notify;
Evas_Object *label;
const char *msg =
"<align=center>Events blocked when this notification is visible."
"<br/>This message will be dismissed after 3 seconds.</>";
/* Create notify (top-aligned / hide automatically / block outside events) */
notify = elm_notify_add(ad->frame);
elm_notify_align_set(notify, EVAS_HINT_FILL, 0.0);
elm_notify_timeout_set(notify, 3.0);
elm_notify_allow_events_set(notify, EINA_FALSE);
/* Create label for notify message */
label = elm_label_add(notify);
evas_object_size_hint_weight_set(label, 1.0, 0.0);
evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_label_line_wrap_set(label, ELM_WRAP_WORD);
elm_object_text_set(label, msg);
elm_object_content_set(notify, label);
evas_object_show(label);
/* We do NOT show the notify yet */
return notify;
}

elm_notify_allow_events_set(Evas_Object *, Eina_Bool) — это функция, которая определяет позволит ли пользователь произойти событию при демонстрации уведомления. Использование в качестве второго параметра значения EINA_FALSE приводит к блокировке пользовательских событий. Запустите пример и нажмите на третью кнопку. Убедитесь, что уведомление появляется и исчезает через три секунды. При демонстрации уведомления кнопка не работает.


Изменение положения уведомления

Мы реализуем возможность демонстрации уведомления в нижней части экрана. Добавьте код в функции create_base_gui() function.

/* Button-3 */
btn = elm_button_add(ad->win);
elm_object_text_set(btn, "Top / Block");
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.0);
evas_object_smart_callback_add(btn, "clicked", btn_click_cb, notify);
elm_box_pack_end(ad->box, btn);
evas_object_show(btn);

notify = create_notify_bottom_timeout(ad);

/* Button-4 */
btn = elm_button_add(ad->win);
elm_object_text_set(btn, "Bottom / Timeout");
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.0);
evas_object_smart_callback_add(btn, "clicked", btn_click_cb, notify);
elm_box_pack_end(ad->box, btn);
evas_object_show(btn);
}

Этот код создает четвертое уведомление и четвертую кнопку. Добавьте функцию выше create_base_gui().

static Evas_Object*
create_notify_bottom_timeout(appdata_s *ad)
{
Evas_Object *notify;
Evas_Object *label;
const char *msg =
"<align=center>This notification shows at the bottom of the screen."
"<br/>This message will be dismissed after 3 seconds.</>";
/* Create notify (bottom-aligned / hide automatically) */
notify = elm_notify_add(ad->frame);
elm_notify_align_set(notify, EVAS_HINT_FILL, 1.0);
elm_notify_timeout_set(notify, 3.0);
/* Create label for notify message */
label = elm_label_add(notify);
evas_object_size_hint_weight_set(label, 1.0, 0.0);
evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_label_line_wrap_set(label, ELM_WRAP_WORD);
elm_object_text_set(label, msg);
evas_object_show(label);
elm_object_content_set(notify, label);
/* We do NOT show the notify yet */
return notify;
}

elm_notify_align_set(Evas_Object *, double, double) - это API, который определяет положение и соотношение сторон уведомления. Запустите пример


< Лекция 4 || Лекция 5 || Лекция 6 >
Тимур Имашев
Тимур Имашев
Россия, Кемерово, КемГИК
Александр Бураков
Александр Бураков
Россия, г.Тюмень, Тюменская область