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

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

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

На этом занятии мы создадим простое приложение 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.

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


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