2016-07-14 38 views
0

如何來調用用戶界面的變化。例如更改進度條,如在此按鈕上顯示的點擊處理程序:更新UI(調用)原生

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

您能否詳細說明在UI中需要哪些類型的更改?您在UI Builder - 導航和用戶界面生成器 - 單一視圖之間使用了哪種版本的本地用戶界面生成器? –

+0

在我用來更新progessbar值的例子中。它也不適用於更新標籤文本。在方法結束時我只看到最終結果。我使用最新版本的本機UI建設者單一視圖 – BorisT

+0

我想你創建一個圓進度。所以首先你需要創建一個圓形進度條。 您可以使用「eext_circle_object_progressbar_add()」函數創建圓形進度條。 在使用圓形進度條之前,使用「eext_circle_object_value_min_max_set()」函數設置其最小值和最大值。 –

回答

0

EFL UI基本上只在一個線程上工作在主循環上。

所以EFL系統無法繪製用戶界面,除非您在事件功能中完成了一些工作。

您可以爲您的作業創建另一個線程並在事件函數中啓動線程。

但使用ecore閒置函數來使用eext_circle_object_value_set。

大部分EFL和tizen函數都必須在主線程中使用。

因此,在另一個線程中運行你的工作,並使用ecore主循環函數向主線程請求進程值設置器。


EFL Ecore爲主循環提供請求作業的同步和異步功能。 ecore_main_loop_thread_safe_call_asyncecore_main_loop_thread_safe_call_sync可以用來代替ecore_idle功能。

所以這裏是簡單的例子有初等進展。 我不使用埃克斯特功能在此源代碼,但你可以參考的elm_progressbar_value_set代替埃克斯特。

#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

好吧我添加代碼給你。 :) –