diff --git a/lv_conf_templ.h b/lv_conf_templ.h index f58594882..806e3bb62 100644 --- a/lv_conf_templ.h +++ b/lv_conf_templ.h @@ -240,6 +240,10 @@ /*Button (dependencies: lv_cont*/ #define USE_LV_BTN 1 +#if USE_LV_BTN +#define LV_BTN_DEF_INK_FILL_TIME 300 /*[ms] Time of fill the button on click with "ink" (0: disable the effect)*/ +#define LV_BTN_DEF_INK_WIAT_TIME 50 /*[ms] Wait before the ink disappears*/ +#endif /*Button matrix (dependencies: -)*/ #define USE_LV_BTNM 1 diff --git a/lv_objx/lv_btn.c b/lv_objx/lv_btn.c index 9cf01c41c..d96e5567e 100644 --- a/lv_objx/lv_btn.c +++ b/lv_objx/lv_btn.c @@ -21,7 +21,13 @@ /********************* * DEFINES *********************/ +#ifndef LV_BTN_DEF_INK_FILL_TIME +# define LV_BTN_DEF_INK_FILL_TIME 200 /*[ms] Time of fill the button on click with "ink" (0: disable the effect)*/ +#endif +#ifndef LV_BTN_DEF_INK_WIAT_TIME +# define LV_BTN_DEF_INK_WIAT_TIME 10 /*[ms] Wait before the ink disappears*/ +#endif /********************** * TYPEDEFS **********************/ @@ -41,8 +47,7 @@ static lv_signal_func_t ancestor_signal; static lv_design_func_t ancestor_design; #if USE_LV_ANIMATION -static lv_point_t ink_point; -static lv_coord_t ink_radius; +static lv_coord_t ink_value; static lv_obj_t * ink_obj; static lv_btn_state_t ink_bg_state; static lv_btn_state_t ink_circle_state; @@ -89,7 +94,8 @@ lv_obj_t * lv_btn_create(lv_obj_t * par, lv_obj_t * copy) ext->long_pr_action_executed = 0; ext->toggle = 0; - ext->ink_time = 300; + ext->ink_fill_time = LV_BTN_DEF_INK_FILL_TIME; + ext->ink_wait_time = LV_BTN_DEF_INK_WIAT_TIME; lv_obj_set_signal_func(new_btn, lv_btn_signal); lv_obj_set_design_func(new_btn, lv_btn_design); @@ -201,17 +207,33 @@ void lv_btn_set_action(lv_obj_t * btn, lv_btn_action_t type, lv_action_t action) /** * Set time of the ink effect (draw a circle on click to animate in the new state) * @param btn pointer to a button object - * @param ink_time the time of the ink animation + * @param time the time of the ink animation */ -void lv_btn_set_ink_time(lv_obj_t * btn, uint16_t ink_time) +void lv_btn_set_ink_fill_time(lv_obj_t * btn, uint16_t time) { lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); -#if USE_LV_ANIMATION - ink_time = 0; +#if USE_LV_ANIMATION == 0 + time = 0; #endif - ext->ink_time = ink_time; + ext->ink_fill_time = time; +} + +/** + * Set the wait time before the ink disappears + * @param btn pointer to a button object + * @param time the time of the ink animation + */ +void lv_btn_set_ink_wait_time(lv_obj_t * btn, uint16_t time) +{ + lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); + +#if USE_LV_ANIMATION == 0 + time = 0; +#endif + + ext->ink_wait_time = time; } /** @@ -292,11 +314,24 @@ lv_action_t lv_btn_get_action(lv_obj_t * btn, lv_btn_action_t type) * @param btn pointer to a button object * @return the time of the ink animation */ -uint16_t lv_btn_get_ink_time(lv_obj_t * btn) +uint16_t lv_btn_get_ink_fill_time(lv_obj_t * btn, uint16_t time) { lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); - return ext->ink_time; + return ext->ink_fill_time; } + + +/** + * Get the wait time before the ink disappears + * @param btn pointer to a button object + * @return the time of the ink animation + */ +uint16_t lv_btn_get_ink_wait_time(lv_obj_t * btn, uint16_t time) +{ + lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); + return ext->ink_wait_time; +} + /** * Get a style of a button * @param btn pointer to a button object @@ -356,16 +391,21 @@ static bool lv_btn_design(lv_obj_t * btn, const lv_area_t * mask, lv_design_mode lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); lv_draw_rect(&btn->coords, mask, ext->styles[ink_bg_state], LV_OPA_COVER); + lv_coord_t w = lv_obj_get_width(btn); + lv_coord_t h = lv_obj_get_height(btn); + lv_coord_t r_max = LV_MATH_MIN(w, h) / 2; lv_style_t cir_style; lv_style_copy(&cir_style, ext->styles[ink_circle_state]); - cir_style.body.radius = LV_RADIUS_CIRCLE; + cir_style.body.radius = r_max + (((ext->styles[ink_bg_state]->body.radius - r_max) * ink_value) >> 10); lv_area_t cir_area; - cir_area.x1 = ink_point.x - ink_radius; - cir_area.y1 = ink_point.y - ink_radius; - cir_area.x2 = ink_point.x + ink_radius; - cir_area.y2 = ink_point.y + ink_radius; + + cir_area.x1 = btn->coords.x1 + w / 2 - (((w / 2) * ink_value) >> 10); + cir_area.y1 = btn->coords.y1 + h / 2 - (((h / 2) * ink_value) >> 10); + cir_area.x2 = btn->coords.x1 + w / 2 + (((w / 2) * ink_value) >> 10); + cir_area.y2 = btn->coords.y1 + h / 2 + (((h / 2) * ink_value) >> 10); + lv_draw_rect(&cir_area, mask, &cir_style, LV_OPA_COVER); } @@ -422,21 +462,20 @@ static lv_res_t lv_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param) lv_obj_invalidate(ink_obj); } /*Save the new data for inking and start it's animation if enabled*/ - if(ext->ink_time > 0) { - lv_indev_get_point(lv_indev_get_act(), &ink_point); + if(ext->ink_fill_time > 0) { ink_obj = btn; lv_anim_t a; a.var = btn; a.start = 0; - a.end = LV_MATH_MAX(lv_obj_get_width(btn), lv_obj_get_height(btn)); + a.end = 1024;//LV_MATH_MAX(lv_obj_get_width(btn), lv_obj_get_height(btn)); a.fp = (lv_anim_fp_t)lv_btn_circle_effect_anim; a.path = lv_anim_path_linear; a.end_cb = lv_btn_circle_effect_anim_ready; a.act_time = 0; - a.time = ext->ink_time; - a.playback = 0; - a.playback_pause = 0; + a.time = ext->ink_fill_time; + a.playback = ext->toggle ? 0 : 1; + a.playback_pause = 100; a.repeat = 0; a.repeat_pause = 0; lv_anim_create(&a); @@ -553,7 +592,7 @@ static lv_res_t lv_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param) static void lv_btn_circle_effect_anim(lv_obj_t * btn, int32_t val) { if(ink_obj) { - ink_radius = val; + ink_value = val; lv_obj_invalidate(ink_obj); } } diff --git a/lv_objx/lv_btn.h b/lv_objx/lv_btn.h index 0f59777d9..2ccd7aae6 100644 --- a/lv_objx/lv_btn.h +++ b/lv_objx/lv_btn.h @@ -65,7 +65,8 @@ typedef struct lv_action_t actions[LV_BTN_ACTION_NUM]; lv_style_t * styles[LV_BTN_STATE_NUM]; /*Styles in each state*/ lv_btn_state_t state; /*Current state of the button from 'lv_btn_state_t' enum*/ - uint16_t ink_time; /*Time of ink effect (0: disable ink effect)*/ + uint16_t ink_fill_time; /*[ms ]Time of ink fill effect (0: disable ink effect)*/ + uint16_t ink_wait_time; /*[ms] Wait before the ink disappears */ uint8_t toggle :1; /*1: Toggle enabled*/ uint8_t long_pr_action_executed :1; /*1: Long press action executed (Handled by the library)*/ } lv_btn_ext_t; @@ -147,9 +148,17 @@ static inline void lv_btn_set_fit(lv_obj_t * btn, bool hor_en, bool ver_en) /** * Set time of the ink effect (draw a circle on click to animate in the new state) * @param btn pointer to a button object - * @param ink_time the time of the ink animation + * @param time the time of the ink animation */ -void lv_btn_set_ink_time(lv_obj_t * btn, uint16_t ink_time); +void lv_btn_set_ink_fill_time(lv_obj_t * btn, uint16_t time); + + +/** + * Set the wait time before the ink disappears + * @param btn pointer to a button object + * @param time the time of the ink animation + */ +void lv_btn_set_ink_wait_time(lv_obj_t * btn, uint16_t time); /** @@ -214,13 +223,19 @@ static inline bool lv_btn_get_ver_fit(lv_obj_t * btn) { return lv_cont_get_ver_fit(btn); } - /** * Get time of the ink effect (draw a circle on click to animate in the new state) * @param btn pointer to a button object * @return the time of the ink animation */ -uint16_t lv_btn_get_ink_time(lv_obj_t * btn); +uint16_t lv_btn_get_ink_fill_time(lv_obj_t * btn, uint16_t time); + +/** + * Get the wait time before the ink disappears + * @param btn pointer to a button object + * @return the time of the ink animation + */ +uint16_t lv_btn_get_ink_wait_time(lv_obj_t * btn, uint16_t time); /** * Get style of a button.