Использование датчика гравитации
Проверим подключен ли детектор гравитации
Положение устройства можно определить с помощью детектора гравитации. Этот сенсор помогает определять направления осей X-, Y-, и Z. Для тестирования датчика в эмуляторе используйте панель управления.
Создайте новый проект 'SensorGravity.' Внесите изменения в начало файла исходного кода.
#include "sensorgravity.h" #include <sensor.h> typedef struct appdata { Evas_Object *win; Evas_Object *conform; Evas_Object *label0; Evas_Object *label1; } appdata_s;
sensor.h — это файл заголовка библиотеки различных сенсоров. Сейчас мы отобразим на экране информацию о том, подключен ли детектор гравитации. Добавьте коды выше функции create_base_gui().
static void show_is_supported(appdata_s *ad) { char buf[PATH_MAX]; bool is_supported = false; sensor_is_supported(SENSOR_GRAVITY, &is_supported); sprintf(buf, "Gravity Sensor is %s", is_supported ? "support" : "not support"); elm_object_text_set(ad->label0, buf); } 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); }
show_is_supported() - это функция, которая определяет поддерживается ли датчик гравитации и отображает результат в метке.
sensor_is_supported(sensor_type_e, bool *) - это API, который определяет поддерживается ли датчик гравитации.
my_box_pack() - это функция, которая добавляет контролы к контейнеру Box. Добавьте код к функции create_base_gui() function.
/* 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); { /* child object - indent to how relationship */ Evas_Object * box, *btn; /* A box to put things in verticallly - default mode for box */ 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); { /* child object - indent to how relationship */ /* Label-0 */ ad->label0 = elm_label_add(ad->conform); elm_object_text_set(ad->label0, "Msg - "); my_box_pack(box, ad->label0, 1.0, 0.0, -1.0, 0.0); /* Label-1 */ ad->label1 = elm_label_add(ad->conform); elm_object_text_set(ad->label1, "Value - "); my_box_pack(box, ad->label1, 1.0, 1.0, -1.0, 0.0); } } /* Show window after base gui is set up */ evas_object_show(ad->win); show_is_supported(ad); }
Мы добавили контейнер Box и две метки. Затем мы вызвали функцию для того, чтобы проверить, поддерживается ли сенсор.
Запустите проект.
Запрос события датчика гравитации
Далее, мы реализуем возможность отображения значения гравитации на экран. Добавьте структуру в начало файла исходного кода.
typedef struct appdata { Evas_Object *win; Evas_Object *conform; Evas_Object *label0; Evas_Object *label1; } appdata_s; typedef struct _sensor_info { sensor_h sensor; /**< Sensor handle */ sensor_listener_h sensor_listener; } sensorinfo; static sensorinfo sensor_info;
sensorinfo — это структура, включающая в себя объект sensor и переменные слушателя события.
sensor_info — это глобальная переменная для структуры sensorinfo .
Запрос сенсорного события означает запуск слушателя. Создайте две функции выше create_base_gui() function.
static void _new_sensor_value(sensor_h sensor, sensor_event_s *sensor_data, void *user_data) { if( sensor_data->value_count < 3 ) return; char buf[PATH_MAX]; appdata_s *ad = (appdata_s*)user_data; sprintf(buf, "Gravity - X : %0.1f / Y : %0.1f / Z : %0.1f", sensor_data->values[0], sensor_data->values[1], sensor_data->values[2]); elm_object_text_set(ad->label1, buf); } static void start_gravity_sensor(appdata_s *ad) { sensor_error_e err = SENSOR_ERROR_NONE; sensor_get_default_sensor(SENSOR_GRAVITY, &sensor_info.sensor); err = sensor_create_listener(sensor_info.sensor, &sensor_info.sensor_listener); sensor_listener_set_event_cb(sensor_info.sensor_listener, 100, _new_sensor_value, ad); sensor_listener_start(sensor_info.sensor_listener); }
_new_sensor_value() - это функция вызова события для сенсора гравитации.
Добавьте строку в конце функции create_base_gui().
/* Show window after base gui is set up */ evas_object_show(ad->win); show_is_supported(ad); start_gravity_sensor(ad); }
Запустите пример. Зайдите в панель управления эмулятора. Убедитесь в том, что вначале мы видим результат 'X : 0.0 / Y : 9.8 / Z : 0.0' в метке.
Поверните устройство. Результат изменится.