События, связанные с изменением ориентации экрана
Запрос ориентации
Ориентация связана с направлением вращения вашего телефона. Портретная ориентация означает вертикальное расположение, пейзажная — горизонтальное. Далее, мы разберем как можно определять ориентацию экрана и запрашивать связанные с этим события.
Создайте новый проект ‘OrientationEventSample.’ Откройте файл исходного кода и добавьте немного кода в конец функции create_base_gui() .
/* Show window after base gui is set up */ evas_object_show(ad>win); // Show now orientation show_orientation(ad, NULL, NULL); }
Функция show_orientation() запрашивает текущее положение экрана и выдает его в метку. Создайте функцию выше create_base_gui().
// Show now orientation static void show_orientation(appdata_s *ad, Evas_Object *obj, void *event_info) { // Get orientation int result = elm_win_rotation_get(ad->win); switch( result ) { case APP_DEVICE_ORIENTATION_0 : elm_object_text_set(ad->label, "Portrait-1"); break; case APP_DEVICE_ORIENTATION_90 : elm_object_text_set(ad->label, "Landscape-1"); break; case APP_DEVICE_ORIENTATION_180 : elm_object_text_set(ad->label, "Portrait-2"); break; case APP_DEVICE_ORIENTATION_270 : elm_object_text_set(ad->label, "Landscape-2"); break; default : elm_object_text_set(ad->label, "Other Event"); break; } }
elm_win_rotation_get(const Evas_Object *) -это API, возвращающий текущую ориентацию. Он возвращает следующие значения:
- APP_DEVICE_ORIENTATION_0 : Первая портретная ориентация
- APP_DEVICE_ORIENTATION_90 : Первая пейзажная ориентация
- APP_DEVICE_ORIENTATION_180 : Вторая портретная ориентация
- APP_DEVICE_ORIENTATION_270 : Вторая пейзажная ориентация
Запустите проект
Поворот экрана в эмуляторе
Далее, мы реализуем возможность вывода ориентации при нажатии на кнопку. Создайте новую функцию выше create_base_gui().
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); }
Затем добавьте код, создающий кнопку в функции 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); { /* 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*/ ad->label = elm_label_add(ad->win); 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); my_box_pack(box, ad->label, 1.0, 0.0, -1.0, 0.0); /* Button-1 */ btn = elm_button_add(ad->win); elm_object_text_set(btn, "Now Orientation"); evas_object_smart_callback_add(btn, "clicked", show_orientation, (void *)ad); my_box_pack(box, btn, 1.0, 0.0, -1.0, -1.0); } } /* Show window after base gui is set up */ evas_object_show(ad->win);
Запустите проект. Нажмите правой кнопкой мыши на эмуляторе и выберите пункт [Rotate → Landscape] из меню.
После поворота экрана нажмите на кнопку.
Поворот ориентации
Далее, мы реализуем возможность изменения ориентации при нажатии на кнопку. Добавьте код создания второй кнопки в функции create_base_gui().
/* Button-1 */ btn = elm_button_add(ad->win); elm_object_text_set(btn, "Now Orientation"); evas_object_smart_callback_add(btn, "clicked", show_orientation, (void *)ad); my_box_pack(box, btn, 1.0, 0.0, -1.0, -1.0); /* Button-2 */ btn = elm_button_add(ad->win); elm_object_text_set(btn, "Change the Orientation"); evas_object_smart_callback_add(btn, "clicked", btn_orientation_change_cb, (void *)ad); my_box_pack(box, btn, 1.0, 1.0, -1.0, 0.0); } }
После этого создайте обработчик нажатия кнопки выше функции create_base_gui().
// 'Orientation Change' Button event function static void btn_orientation_change_cb(void *data, Evas_Object *obj, void *event_info) { appdata_s *ad = (appdata_s*)data; // Get orientation int result = elm_win_rotation_get(ad->win); if( result == APP_DEVICE_ORIENTATION_0 || result == APP_DEVICE_ORIENTATION_180 ) elm_win_rotation_with_resize_set(ad->win, APP_DEVICE_ORIENTATION_90); else elm_win_rotation_with_resize_set(ad->win, APP_DEVICE_ORIENTATION_0); }
Этот код идентифицирует текущую ориентацию и изменяет ее по необходимости из портретной в пейзажную и наоборот.
elm_win_rotation_with_resize_set(Evas_Object *, int) - это API, который изменяет ориентацию. Он принимает следующие значения:
- APP_DEVICE_ORIENTATION_0 : Первая портретная
- APP_DEVICE_ORIENTATION_90 : Первая пейзажная
- APP_DEVICE_ORIENTATION_180 : Вторая портретная
- APP_DEVICE_ORIENTATION_270 : Вторая пейзажная
Запустите пример
Запрос событий при изменении ориентации
Давайте создадим запрос на событие, происходящее при изменении ориентации. Добавьте код в конце функции create_base_gui() .
// Show now orientation show_orientation(ad, NULL, NULL); // Set callback function of orientation change event evas_object_smart_callback_add(ad->win, "rotation,changed", win_rotation_changed_cb, ad); }
evas_object_smart_callback_add(Evas_Object *, char *, Evas_Smart_Cb, void*) - это API, который определяет функцию вызова для смарт-объектов, таких как контейнер Layout или кнопка. Добавьте код выше функции create_base_gui() function.
// Orientation changed event function static void win_rotation_changed_cb(void *data, Evas_Object *obj, void *event_info) { appdata_s *ad = (appdata_s*)data; show_orientation(ad, NULL, NULL); }
Запустите проект
Фиксация ориентации
Давайте зафиксируем ориентацию при вращении устройства. Доступные типы ориентации описаны в начале функции create_base_gui() .
int rots[4] = { 0, 90, 180, 270 }; elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
Внесем следующие изменения.
int rots[1] = { 0 }; elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 1);
elm_win_wm_rotation_available_rotations_set(Evas_Object *, int *, unsigned int) - это API, который определяет возможные типы ориентации. Вторым параметром является массив возможных углов поворота. Запустите проект. Поворачивайте устройство. Ориентация при этом не изменится.