littlevgl之button分析

談到按鈕,會涉及到按鈕的按下與釋放操作,所以就少不了鼠標(或者其他輸入類型)。然後按鈕還需要根據鼠標的操作情況修改按鍵的顯示,而顯示就涉及到怎麼去畫按鈕。這節就圍繞著三個方面進行討論。


怎麼獲取鼠標數據。

在整個GUI中定義了一個線程monitor_sdl_refr_thread(),在這個線程中定義了mouse_handler(),就涉及到了幾個鼠標事件SDL_MOUSEBUTTONUP,SDL_MOUSEBUTTONDOWN,SDL_MOUSEMOTION,SDL_MOUSEWHEEL。其中,SDL_MOUSEBUTTONDOWN表示了鼠標按下了(注意只支持鼠標左鍵按下)。那麼就將鼠標的位置值賦值給變量last_x與last_y,如果鼠標在移動SDL_MOUSEMOTION,則也需要獲取實時的鼠標座標值。

之後,在另外一個線程中lv_indev_read_task()會使用這些數據信息,首先,定義一個回調函數read_cb()賦值為mouse_read(),它的作用就是讀取sdl層中的鼠標是否按下state(轉換為該線程中定義的屬性值LV_INDEV_STATE_PR與LV_INDEV_STATE_REL)以及座標值。說明一下,LV_INDEV_STATE_PR表示鼠標按下,LV_INDEV_STATE_REL表示鼠標釋放(彈起release)。另外,這裡是讀取的鼠標的相關數據,所以類型type定義為LV_INDEV_TYPE_POINTER。


鼠標對按鈕執行操作之後,按鈕怎麼改變顏色

在線程lv_indev_read_task()中調用到函數indev_pointer_proc(),最終調用到函數indev_proc_press(),如果是按鈕按下操作,則實際調用到signal與event兩個函數。

信號則實際是調用函數lv_btn_signal(indev_obj_act, LV_SIGNAL_PRESSED, indev_act),這裡面會調用到lv_btn_set_state(btn, LV_BTN_STATE_PR);,也就是將按鈕狀態設置為LV_BTN_STATE_PR,並將按鈕風格也相應的做一下改變。

而事件則是調用函數lv_event_send(indev_obj_act, LV_EVENT_PRESSED, NULL);,實際涉及到的事件函數為btn_event_cb()

另外說一下:

Button啟動時候的配色方案是在結構體lv_style_btn_rel體現出來的,還有button按下時候的配色方案是用的結構體lv_style_btn_pr。

同樣,具體的方案設置在如下代碼可以知悉:

<code>    ext->state = LV_BTN_STATE_REL;

    ext->styles[LV_BTN_STATE_REL]     = &lv_style_btn_rel;

    ext->styles[LV_BTN_STATE_PR]      = &lv_style_btn_pr;

    ext->styles[LV_BTN_STATE_TGL_REL] = &lv_style_btn_tgl_rel;

    ext->styles[LV_BTN_STATE_TGL_PR]  = &lv_style_btn_tgl_pr;

    ext->styles[LV_BTN_STATE_INA]     = &lv_style_btn_ina;/<code>


button畫圖

這跟畫label的執行流程類似,這裡就不多說了。


分享到:


相關文章: