Разработка нативных приложений Tizen

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

Разбить на страницы
Показывать лекцию целиком

На этом занятии мы создадим простое приложение BasicUI и познакомимся с основными этапами разработки нативных приложений Tizen. Создаем проект HelloWorld File →New→ Tizen Native Project → UI Application → Basic UI Application → HelloWorld.

Запустим проект: Project → Build All → Run.

Изменим надпись Hello EFL в метке.

Для этого нам потребуется открыть исходный код приложения (файл helloworld.c). Мы увидим следующее:

#include "helloworld.h"
typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
Evas_Object *label;
} appdata_s;
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);
}

Команда #include "helloworld.h" ссылается на файл ‘helloworld.h’ в папке ‘inc'.

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

‘appdata_s — это структура, предназначенная для хранения данных, используемых в приложении.

‘win_delete_request_cb() - это функция, которую нельзя вызвать непосредственно. Она срабатывает при запросе на удаление приложения.

‘win_back_cb() - это функция, срабатывающая при нажатии на кнопку Back. Эта функция не запускается непосредственно.

static void
create_base_gui(appdata_s *ad)
{
/* Window */
ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
elm_win_autodel_set(ad->win, EINA_TRUE);
if (elm_win_wm_rotation_supported_get(ad->win)) {
int rots[4] = { 0, 90, 180, 270 };
elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(rots), 4);
}
evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
/* 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);
/* Label*/
ad->label = elm_label_add(ad->conform);
elm_object_text_set(ad->label, "<align=center>Hello EFL</align>");
evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(ad->conform, ad->label);
/* Show window after base gui is set up */
evas_object_show(ad->win);
}

Ниже мы объясним некоторые строки из основного кода.

elm_win_util_standard_add() - это API, создающий объект Window. Window — это самый верхний объект в макете экрана. Приложение (app) имеет отдельное окно.

Тем не менее, более распространенный метод заключается в добавлении контейнера и затем добавлении виджета в верхнюю часть контейнера.

elm_win_wm_rotation_available_rotations_set() - это API, определяющий ориентацию экрана. Четыре угла, задающие ориентацию (0, 90, 180, и 270), задаются в виде массива rots.

evas_object_smart_callback_add() - это API, определяющий функцию события обратного вызова для смарт-объектов, таких, как виджеты или контейнеры. В качестве первого параметра выступает наблюдаемое событие, второй параметр — это тип события, третий параметр — имя функции обратного вызова, четвертый параметр — данные пользователя. Если тип события "delete,request", это значит, что объект должен быть удален.

eext_object_event_callback_add() - это API, определяющий функцию события обратного вызова для объекта. Можно использовать этот API как для смарт-объектов, так и для обычных объектов. В качестве первого параметра используется объект, в котором происходит событие, второй параметр — тип события, третий параметр — имя функции обратного вызова, четвертый параметр — данные пользователя.

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

elm_conformant_add() - это API, создающий Conformant (совместимость). Conformant изменяет размер окна при добавлении новых элементов (например, клавиатуры) к экрану. Приложение должно иметь не более одного Conformant. Приложение может и не иметь Conformant. Conformant необходим для отображения индикатора (полосы состояния) в верхней части экрана.

elm_win_indicator_mode_set() - это API, который определяет, следует ли отображать индикатор

elm_win_indicator_opacity_set() - это API, который определяет прозрачность индикатора

evas_object_size_hint_weight_set() - это API, который определяет приблизительные размеры объекта. Ниже приведены параметры, перечисленные в следующем порядке: объект, приблизительные горизонтальные размеры, и приблизительные вертикальные размеры.

EVAS_HINT_EXPAND означает максимально возможный размер холста.

elm_win_resize_object_add() - это API, который переопределяет размер объекта Window при добавлении к нему другого объекта.

evas_object_show() - это API, который отображает объект. При создании объекта значением по умолчанию является Hide (скрыть).

elm_label_add() - это API, который создает виджет. Виджет Label (метка), например, позволяет отображать текст, также, как и изменять свойства текста, такие как размер или цвет текста с помощью тегов HTML.

Изменение текста в метке

Теперь мы изменим надпись 'Hello EFL', отображаемую на экране. Для этого нам потребуется внести изменения в функцию ‘elm_object_text_set()’, показанную ниже.

ad->label = elm_label_add(ad->conform);
//elm_object_text_set(ad->label, "<align=center>Hello EFL</align>");
elm_object_text_set(ad->label, "Hello World");
evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);

elm_object_text_set() - это API, изменяющий текст в виджете. Вы можете использовать эту функцию для виджетов Button (кнопка) или Entry (поле ввода) также, как и для элемента управления Label.

Запустим наш проект, заменив строку

elm_object_text_set(ad->label, "<align=center>Hello EFL</align>");

на

elm_object_text_set(ad->label, "<b><align=center>Per aspera ad astra</align></b>");

Изменение положения метки с помощью абсолютных координат

Метки размещаются в левой части экрана. Функция evas_object_size_hint_weight_set() определяет относительный размер объекта, поскольку горизонтальная и вертикальная опции функции определяются как 'EVAS_HINT_EXPAND'. В качестве первого параметра указывается объект, чьи свойства вы хотите определить, второй параметр — размер по горизонтали, третий параметр — размер по вертикали. Давайте теперь изменим положение метки, задав ее абсолютные координаты. Изменим код, приведенный ниже.

elm_object_text_set(ad->label, "<b><align=center>Per aspera ad astra</align></b>");
//evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
//elm_object_content_set(ad->conform, ad->label);
evas_object_move(ad->label, 100, 200);
evas_object_resize(ad->label, 400, 100);
evas_object_show(ad->label);

evas_object_move() - это функция, которая определяет положение объекта по абсолютной величине. Введите значения параметров в следующем порядке: объект, чьи свойства вы хотите задать, положение X-координаты, и положение Y-координаты.

evas_object_resize()- это функция, которая определяет размер объекта по абсолютной величине. Введите значения параметров в следующем порядке: объект, чьи свойства вы хотите задать, X-координату (ширина), и Y-координату (высота).

Запустите проект.

Использование различных разрешений с помощью контейнера Box

Определение абсолютных координат, методом, показанным выше, удобно. Однако, вы не можете таким способом использовать различные разрешения вашего терминала. Рассмотрим, как это можно сделать с помощью контейнера Box.

Добавьте новую функцию выше функции create_base_gui() function.

static void
my_box_pack(Evas_Object *box, Evas_Object *child,
double h_weight, double v_weight, double h_align, double v_align)
{
/* create a frame we shall use as padding around the child widget */
Evas_Object *frame = elm_frame_add(box);
/* use the medium padding style. there is "pad_small", "pad_medium",
* "pad_large" and "pad_huge" available as styles in addition to the
* "default" frame style */
elm_object_style_set(frame, "pad_medium");
/* set the input weight/aling on the frame insted of the child */
evas_object_size_hint_weight_set(frame, h_weight, v_weight);
evas_object_size_hint_align_set(frame, h_align, v_align);
{
/* tell the child that is packed into the frame to be able to expand */
evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
/* fill the expanded area (above) as opposaed to center in it */
evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL);
/* actually put the child in the frame and show it */
evas_object_show(child);
elm_object_content_set(frame, child);
}
/* put the frame into the box instead of the child directly */
elm_box_pack_end(box, frame);
/* show the frame */
evas_object_show(frame);
}

my_box_pack() - это функция, добавляющая элемент управления в контейнер Box. Box — это контейнер, который успешно добавляет виджет элементы управления или контейнеры в вертикальной или горизонтальной ориентации. Он играет аналогичную роль с LinearLayout в Android. Эту функцию мы будем часто использовать позже. Детальное объяснение контейнера Box будет дано при объяснении соответствующего примера.

В качестве первого параметра функции my_box_pack() используется обработчик контейнера Box, второй параметр — виджет или контейнер, добавляемый в контейнер Box, третий параметр — горизонтальные размеры виджета.

Вводя значение 1.0 для EVAS_HINT_EXPAND, мы задаем горизонтальный размер элемента управления настолько большим, насколько это возможно, вводя 0.0 — определяем размер настолько маленьким, насколько это возможно. В случае с виджетом Bg размер по умолчанию будет 0. Если задать 0.0, то виджет не появится на экране. Четвертый параметр — вертикальный размер виджета, пятый параметр — горизонтальное положение виджета, при нуле — выравнивание по левому краю, при 0.5 — по центру, при 1.0 — выравнивание по правому краю, вводя EVAS_HINT_FILL или -1, мы даем возможность занять виджету всю ширину. Шестой параметр — вертикальное положение виджета, вводя 0.0 мы выравниваем видже по верхнему краю, 0.5 — по середине, 1.0 — по нижнему краю. Вводя EVAS_HINT_FILL или -1, мы даем возможность виджету занять всю область по вертикали.

Измените исходный код в нижней части функции create_base_gui() так, как показано ниже.

/* 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);
{
/* A box to put things in verticallly - default mode for box */
Evas_Object *box = elm_box_add(ad->win);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(ad->conform, box);
evas_object_show(box);
{
/* Label*/
ad->label = elm_label_add(ad->conform);
elm_object_text_set(ad->label, "<b><align=center>Per aspera ad astra</align></b>");
my_box_pack(box, ad->label, 1.0, 0.0, -1.0, 0.5);
}
}
/* Show window after base gui is set up */
evas_object_show(ad->win);
}

Символ {} использовали для clarify the inclusion взаимосвязи между верхним объектом (Window) и нижним объектом (Window). Это необходимо для использования этого символа. Тем не менее, вследствие большой разности в читабельности в тех случаях когда вы используете и не используете его мы рекомендуем использовать habit.

elm_box_add() - это API, который создает контейнер Box.

Давайте запустим наш пример. Виджет будет отображаться с другим разрешением.

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

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

Давайте изменим исходный код, используя метод, предложенный Карстеном Хайтцлером, автором 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 определе приблизительные размеры объекта.

Страницы:

На этом занятии мы создадим простое приложение BasicUI и познакомимся с основными этапами разработки нативных приложений Tizen. Создаем проект HelloWorld File →New→ Tizen Native Project → UI Application → Basic UI Application → HelloWorld.

Запустим проект: Project → Build All → Run.

Изменим надпись Hello EFL в метке.

Для этого нам потребуется открыть исходный код приложения (файл helloworld.c). Мы увидим следующее:

#include "helloworld.h"
typedef struct appdata {
Evas_Object *win;
Evas_Object *conform;
Evas_Object *label;
} appdata_s;
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);
}

Команда #include "helloworld.h" ссылается на файл ‘helloworld.h’ в папке ‘inc'.

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

‘appdata_s — это структура, предназначенная для хранения данных, используемых в приложении.

‘win_delete_request_cb() - это функция, которую нельзя вызвать непосредственно. Она срабатывает при запросе на удаление приложения.

‘win_back_cb() - это функция, срабатывающая при нажатии на кнопку Back. Эта функция не запускается непосредственно.

static void
create_base_gui(appdata_s *ad)
{
/* Window */
ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
elm_win_autodel_set(ad->win, EINA_TRUE);
if (elm_win_wm_rotation_supported_get(ad->win)) {
int rots[4] = { 0, 90, 180, 270 };
elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(rots), 4);
}
evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
/* 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);
/* Label*/
ad->label = elm_label_add(ad->conform);
elm_object_text_set(ad->label, "<align=center>Hello EFL</align>");
evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(ad->conform, ad->label);
/* Show window after base gui is set up */
evas_object_show(ad->win);
}

Ниже мы объясним некоторые строки из основного кода.

elm_win_util_standard_add() - это API, создающий объект Window. Window — это самый верхний объект в макете экрана. Приложение (app) имеет отдельное окно.

Тем не менее, более распространенный метод заключается в добавлении контейнера и затем добавлении виджета в верхнюю часть контейнера.

elm_win_wm_rotation_available_rotations_set() - это API, определяющий ориентацию экрана. Четыре угла, задающие ориентацию (0, 90, 180, и 270), задаются в виде массива rots.

evas_object_smart_callback_add() - это API, определяющий функцию события обратного вызова для смарт-объектов, таких, как виджеты или контейнеры. В качестве первого параметра выступает наблюдаемое событие, второй параметр — это тип события, третий параметр — имя функции обратного вызова, четвертый параметр — данные пользователя. Если тип события "delete,request", это значит, что объект должен быть удален.

eext_object_event_callback_add() - это API, определяющий функцию события обратного вызова для объекта. Можно использовать этот API как для смарт-объектов, так и для обычных объектов. В качестве первого параметра используется объект, в котором происходит событие, второй параметр — тип события, третий параметр — имя функции обратного вызова, четвертый параметр — данные пользователя.

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

elm_conformant_add() - это API, создающий Conformant (совместимость). Conformant изменяет размер окна при добавлении новых элементов (например, клавиатуры) к экрану. Приложение должно иметь не более одного Conformant. Приложение может и не иметь Conformant. Conformant необходим для отображения индикатора (полосы состояния) в верхней части экрана.

elm_win_indicator_mode_set() - это API, который определяет, следует ли отображать индикатор

elm_win_indicator_opacity_set() - это API, который определяет прозрачность индикатора

evas_object_size_hint_weight_set() - это API, который определяет приблизительные размеры объекта. Ниже приведены параметры, перечисленные в следующем порядке: объект, приблизительные горизонтальные размеры, и приблизительные вертикальные размеры.

EVAS_HINT_EXPAND означает максимально возможный размер холста.

elm_win_resize_object_add() - это API, который переопределяет размер объекта Window при добавлении к нему другого объекта.

evas_object_show() - это API, который отображает объект. При создании объекта значением по умолчанию является Hide (скрыть).

elm_label_add() - это API, который создает виджет. Виджет Label (метка), например, позволяет отображать текст, также, как и изменять свойства текста, такие как размер или цвет текста с помощью тегов HTML.

Изменение текста в метке

Теперь мы изменим надпись 'Hello EFL', отображаемую на экране. Для этого нам потребуется внести изменения в функцию ‘elm_object_text_set()’, показанную ниже.

ad->label = elm_label_add(ad->conform);
//elm_object_text_set(ad->label, "<align=center>Hello EFL</align>");
elm_object_text_set(ad->label, "Hello World");
evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);

elm_object_text_set() - это API, изменяющий текст в виджете. Вы можете использовать эту функцию для виджетов Button (кнопка) или Entry (поле ввода) также, как и для элемента управления Label.

Запустим наш проект, заменив строку

elm_object_text_set(ad->label, "<align=center>Hello EFL</align>");

на

elm_object_text_set(ad->label, "<b><align=center>Per aspera ad astra</align></b>");

Изменение положения метки с помощью абсолютных координат

Метки размещаются в левой части экрана. Функция evas_object_size_hint_weight_set() определяет относительный размер объекта, поскольку горизонтальная и вертикальная опции функции определяются как 'EVAS_HINT_EXPAND'. В качестве первого параметра указывается объект, чьи свойства вы хотите определить, второй параметр — размер по горизонтали, третий параметр — размер по вертикали. Давайте теперь изменим положение метки, задав ее абсолютные координаты. Изменим код, приведенный ниже.

elm_object_text_set(ad->label, "<b><align=center>Per aspera ad astra</align></b>");
//evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
//elm_object_content_set(ad->conform, ad->label);
evas_object_move(ad->label, 100, 200);
evas_object_resize(ad->label, 400, 100);
evas_object_show(ad->label);

evas_object_move() - это функция, которая определяет положение объекта по абсолютной величине. Введите значения параметров в следующем порядке: объект, чьи свойства вы хотите задать, положение X-координаты, и положение Y-координаты.

evas_object_resize()- это функция, которая определяет размер объекта по абсолютной величине. Введите значения параметров в следующем порядке: объект, чьи свойства вы хотите задать, X-координату (ширина), и Y-координату (высота).

Запустите проект.

Использование различных разрешений с помощью контейнера Box

Определение абсолютных координат, методом, показанным выше, удобно. Однако, вы не можете таким способом использовать различные разрешения вашего терминала. Рассмотрим, как это можно сделать с помощью контейнера Box.

Добавьте новую функцию выше функции create_base_gui() function.

static void
my_box_pack(Evas_Object *box, Evas_Object *child,
double h_weight, double v_weight, double h_align, double v_align)
{
/* create a frame we shall use as padding around the child widget */
Evas_Object *frame = elm_frame_add(box);
/* use the medium padding style. there is "pad_small", "pad_medium",
* "pad_large" and "pad_huge" available as styles in addition to the
* "default" frame style */
elm_object_style_set(frame, "pad_medium");
/* set the input weight/aling on the frame insted of the child */
evas_object_size_hint_weight_set(frame, h_weight, v_weight);
evas_object_size_hint_align_set(frame, h_align, v_align);
{
/* tell the child that is packed into the frame to be able to expand */
evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
/* fill the expanded area (above) as opposaed to center in it */
evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL);
/* actually put the child in the frame and show it */
evas_object_show(child);
elm_object_content_set(frame, child);
}
/* put the frame into the box instead of the child directly */
elm_box_pack_end(box, frame);
/* show the frame */
evas_object_show(frame);
}

my_box_pack() - это функция, добавляющая элемент управления в контейнер Box. Box — это контейнер, который успешно добавляет виджет элементы управления или контейнеры в вертикальной или горизонтальной ориентации. Он играет аналогичную роль с LinearLayout в Android. Эту функцию мы будем часто использовать позже. Детальное объяснение контейнера Box будет дано при объяснении соответствующего примера.

В качестве первого параметра функции my_box_pack() используется обработчик контейнера Box, второй параметр — виджет или контейнер, добавляемый в контейнер Box, третий параметр — горизонтальные размеры виджета.

Вводя значение 1.0 для EVAS_HINT_EXPAND, мы задаем горизонтальный размер элемента управления настолько большим, насколько это возможно, вводя 0.0 — определяем размер настолько маленьким, насколько это возможно. В случае с виджетом Bg размер по умолчанию будет 0. Если задать 0.0, то виджет не появится на экране. Четвертый параметр — вертикальный размер виджета, пятый параметр — горизонтальное положение виджета, при нуле — выравнивание по левому краю, при 0.5 — по центру, при 1.0 — выравнивание по правому краю, вводя EVAS_HINT_FILL или -1, мы даем возможность занять виджету всю ширину. Шестой параметр — вертикальное положение виджета, вводя 0.0 мы выравниваем видже по верхнему краю, 0.5 — по середине, 1.0 — по нижнему краю. Вводя EVAS_HINT_FILL или -1, мы даем возможность виджету занять всю область по вертикали.

Измените исходный код в нижней части функции create_base_gui() так, как показано ниже.

/* 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);
{
/* A box to put things in verticallly - default mode for box */
Evas_Object *box = elm_box_add(ad->win);
evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_object_content_set(ad->conform, box);
evas_object_show(box);
{
/* Label*/
ad->label = elm_label_add(ad->conform);
elm_object_text_set(ad->label, "<b><align=center>Per aspera ad astra</align></b>");
my_box_pack(box, ad->label, 1.0, 0.0, -1.0, 0.5);
}
}
/* Show window after base gui is set up */
evas_object_show(ad->win);
}

Символ {} использовали для clarify the inclusion взаимосвязи между верхним объектом (Window) и нижним объектом (Window). Это необходимо для использования этого символа. Тем не менее, вследствие большой разности в читабельности в тех случаях когда вы используете и не используете его мы рекомендуем использовать habit.

elm_box_add() - это API, который создает контейнер Box.

Давайте запустим наш пример. Виджет будет отображаться с другим разрешением.

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

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

Давайте изменим исходный код, используя метод, предложенный Карстеном Хайтцлером, автором 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 определе приблизительные размеры объекта.

Вернуться к учебному плану