2016-07-14 5 views
0

Как вызвать изменения в пользовательском интерфейсе. например, изменить индикатор прогресса, как показано на этой кнопке обработчик щелчка:обновление UI (invoke) native

void view1_Button_onclicked(uib_view1_view_context *vc, Evas_Object *obj, void *event_info) 
{ 
    eext_circle_object_value_set(vc->progressbar1, 50.0); 
    sleep(2); //or do anything intensive like network load 
    eext_circle_object_value_set(vc->progressbar1, 100.0); 
} 
+0

Не могли бы вы уточнить, какие изменения вам нужны в пользовательском интерфейсе? Какую версию Native Builder вы использовали между UI Builder - Navigation и UI Builder - Single View? –

+0

в примере, который я использовал для обновления значения progessbar. Он также не работает для обновления текста ярлыка. В конце метода я вижу только конечный результат. Я использую последнюю версию Native UI builder с единственным представлением – BorisT

+0

Я думаю, что вы создаете панель прогресса круга. Итак, во-первых, вам нужно создать шкалу прогресса круга. Вы можете создать панель прогресса круга, используя функцию «eext_circle_object_progressbar_add()». Прежде чем использовать панель прогресса круга, установите ее минимальное и максимальное значения с помощью функции «eext_circle_object_value_min_max_set()». –

ответ

0

EFL UI Bascially работает на основной цикл только с одной нитью.

поэтому система EFL не может нарисовать интерфейс, пока вы не закончите какую-либо работу в своей функции.

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

, но используйте ecore idle для использования eext_circle_object_value_set.

Большинство функций EFL и tizen должны использоваться в основной резьбе.

поэтому запустите свое задание в другом потоке и запросите установщик значений заданий в основной поток с помощью функций главного цикла ecore.


EFL Функция синхронизации эхо-сигнала Ecore и функция асинхронного запроса для запроса задания на основной цикл. ecore_main_loop_thread_safe_call_async и ecore_main_loop_thread_safe_call_sync могут использоваться вместо функций ecore_idle.

так вот простой пример с элементарными прогрессиями. Я не использую функции eext в этом источнике, но вы можете ссылаться на elm_progressbar_value_set вместо eext.

#include <Elementary.h> 

struct progresses 
{ 
    Evas_Object *moving; 
    Evas_Object *status; 
}; 

struct progress_with_value 
{ 
    Evas_Object *progress; 
    double value; 
}; 

static void* progress_setter_async(void *data) 
{ 
    struct progress_with_value *pv = data; 
    elm_progressbar_value_set(pv->progress, pv->value); 
    return NULL; 
} 

static void some_job_cb(void *data, Ecore_Thread *thread) 
{ 
    int i=0; 
    struct progresses *p = data; 

    struct progress_with_value pv_moving = {p->moving, 0.0}; 
    struct progress_with_value pv_status = {p->status, 0.0}; 

    ecore_main_loop_thread_safe_call_sync(progress_setter_async, &pv_moving); 
    ecore_main_loop_thread_safe_call_sync(progress_setter_async, &pv_status); 

    while (i++<=10) 
    { 
    usleep(200000); 
    pv_moving.value = i * 0.1; 
    ecore_main_loop_thread_safe_call_sync(progress_setter_async, &pv_moving); 
    } 

    pv_status.value = 1.0; 
    ecore_main_loop_thread_safe_call_sync(progress_setter_async, &pv_status); 
} 

static void on_clicked_cb(void *data, Evas_Object *obj, void *event_info) 
{ 
    ecore_thread_run(some_job_cb, NULL, NULL, data); 
} 

int main(int argc, char* argv[]) 
{ 
    Evas_Object *win; 

    elm_init(argc, argv); 
    elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); 

    win = elm_win_add(NULL, "sample", ELM_WIN_BASIC); 
    elm_win_title_set(win, "Sample"); 
    elm_win_autodel_set(win, EINA_TRUE); 
    evas_object_resize(win, 800, 600); 
    evas_object_show(win); 


    Evas_Object *box = elm_box_add(win); 
    evas_object_resize(box, 800, 600); 
    evas_object_show(box); 

    Evas_Object *btn = elm_button_add(win); 
    elm_object_text_set(btn, "Start Progress 0.0 to 1.0"); 
    evas_object_show(btn); 
    elm_box_pack_end(box, btn); 

    Evas_Object *wheel = elm_progressbar_add(win); 
    elm_object_style_set(wheel, "wheel"); 
    elm_progressbar_pulse_set(wheel, EINA_TRUE); 
    elm_progressbar_pulse(wheel, EINA_TRUE); 
    evas_object_show(wheel); 
    elm_box_pack_end(box, wheel); 

    struct progresses p; 
    p.moving = elm_progressbar_add(win); 
    p.status = elm_progressbar_add(win); 
    evas_object_show(p.moving); 
    evas_object_show(p.status); 
    evas_object_size_hint_align_set(p.moving, EVAS_HINT_FILL, 0.5); 
    evas_object_size_hint_align_set(p.status, EVAS_HINT_FILL, 0.5); 
    elm_box_pack_end(box, p.moving); 
    elm_box_pack_end(box, p.status); 

    evas_object_smart_callback_add(btn, "clicked", on_clicked_cb, &p); 

    elm_run(); 
    elm_shutdown(); 

    return 0; 
} 
+0

да, но какой-то код будет прекрасным :) – BorisT

+0

ok Я добавляю код для вас. :) –

Смежные вопросы