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

Разработка простого приложения BasicUI

< Лекция 1 || Лекция 2: 12 || Лекция 3 >

Необязательная модификации кода

Удаляя необязательную часть кода, добавленную по умолчанию, можно увеличить производительность проекта.

Давайте изменим исходный код, используя метод, предложенный Карстеном Хайтцлером, автором EFL.

Переходим в начало файла и удаляем функцию win_delete_request_cb() и модифицируем функцию win_back_cb() как показано ниже.

/*static void
win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
{
ui_app_exit();
}*/
static void
win_back_cb(void *data, Evas_Object *obj, void *event_info)
{
appdata_s *ad = data;
/* Let window go to hide state. */
//elm_win_lower(ad->win);
elm_win_iconified_set(ad->win, EINA_TRUE);
}

win_delete_request_cb() - это функция обратного вызова, использованная в функции create_base_gui() в коде ниже. Это событие используется на персоналках и, следовательно, редко используется на мобильных устройствах.

Evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);

Перейдите к функции create_base_gui() и модифицируйте начало этой функции так, как показано ниже.

static void
create_base_gui(appdata_s *ad)
{
/* set up policy to exit when last window is closed */
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
/* Window */
ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
elm_win_autodel_set(ad->win, EINA_TRUE);
int rots[4] = { 0, 90, 180, 270 };
elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
/* child object - indent to how relationship */
/* 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);

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

- ui_app_orient_changed()
- ui_app_region_changed()
- ui_app_low_battery()
- ui_app_low_memory()

Затем из функции main() в нижней части исходного кода удалите часть, которая определяет указанные выше функции обратного вызова.

int
main(int argc, char *argv[])
{
appdata_s ad = {0,};
int ret = 0;
ui_app_lifecycle_callback_s event_callback = {0,};
app_event_handler_h handlers[5] = {NULL, };
event_callback.create = app_create;
event_callback.terminate = app_terminate;
event_callback.pause = app_pause;
event_callback.resume = app_resume;
event_callback.app_control = app_control;
//ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY],APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
//ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY],APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
//ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED],APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
//ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
//ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);
ret = ui_app_main(argc, argv, &event_callback, &ad);
if (ret != APP_ERROR_NONE) {
dlog_print(DLOG_ERROR, LOG_TAG, "app_main() is failed. err = %d", ret);
}
return ret;
}

Родственные APIs

appdata_s: структура, которая сохраняет информацию.

void create_base_gui(appdata_s *ad): функция, которая создает окно и различные контейнеры и виджеты и размещае их на экране.

void win_delete_request_cb(): функция события, которая запускается при удалении приложения, не может вызыватья непосредственно.

void win_back_cb(): функция события, которая запускается при нажатии на кнопку Back, не может вызыватья непосредственно.

Evas_Object *elm_win_util_standard_add(char *name, char *title): функция, которая создает объект Window. Window — это наивысший объект в макете экрана. Приложение имеет отдельное окно. Вы можете разместить виджет в окне. Тем не менее, обычно добавляется контейнер, после чего виджет добавляется в верхнюю часть контейнера.

void elm_win_wm_rotation_available_rotations_set(Elm_Win *obj, const int *rotations, unsigned int count): API, определяющий ориентацию экрана, возможны четыре варианта углов: 0, 90, 180, и 270 градусов.

void evas_object_smart_callback_add(Evas_Object *obj, const char *event, Evas_Smart_Cb func, const void *data): это API, который определяет событие функции обратного вызова для смарт-объектов.

void eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data): это API, который определяет событие функции обратного вызова как для смарт-объектов, так и для обычных объектов.

EEXT_CALLBACK_BACK сообщает о нажатии на кнопку Back.

Evas_Object *elm_conformant_add(Evas_Object *parent): это функция, которая создает контейнер Conformant.

void elm_win_indicator_mode_set(Elm_Win *obj, Elm_Win_Indicator_Mode mode): этот API определяет включен ли индикатор.

void elm_win_indicator_opacity_set(Elm_Win *obj,Elm_Win_Indicator_Opacity_Mode mode): этот API определяет непрозрачность индикатора.

void evas_object_size_hint_weight_set(Evas_Object *obj, double x, double y): этот API определе приблизительные размеры объекта.

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