1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00

fix(scroll): do not fire scroll begin/end event on every scroll step

fixes: #3436
This commit is contained in:
Gabor Kiss-Vamosi 2022-07-01 13:55:44 +02:00
parent e5c11f1f68
commit 25ce6e3ae9
3 changed files with 35 additions and 20 deletions

View File

@ -85,7 +85,8 @@ void _lv_indev_scroll_handler(_lv_indev_proc_t * proc)
/*Respect the scroll limit area*/ /*Respect the scroll limit area*/
scroll_limit_diff(proc, &diff_x, &diff_y); scroll_limit_diff(proc, &diff_x, &diff_y);
lv_obj_scroll_by(scroll_obj, diff_x, diff_y, LV_ANIM_OFF); _lv_obj_scroll_by_raw(scroll_obj, diff_x, diff_y);
if(proc->reset_query) return;
proc->types.pointer.scroll_sum.x += diff_x; proc->types.pointer.scroll_sum.x += diff_x;
proc->types.pointer.scroll_sum.y += diff_y; proc->types.pointer.scroll_sum.y += diff_y;
} }

View File

@ -31,7 +31,6 @@
/********************** /**********************
* STATIC PROTOTYPES * STATIC PROTOTYPES
**********************/ **********************/
static lv_res_t scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y);
static void scroll_x_anim(void * obj, int32_t v); static void scroll_x_anim(void * obj, int32_t v);
static void scroll_y_anim(void * obj, int32_t v); static void scroll_y_anim(void * obj, int32_t v);
static void scroll_anim_ready_cb(lv_anim_t * a); static void scroll_anim_ready_cb(lv_anim_t * a);
@ -352,7 +351,7 @@ void lv_obj_scroll_by(lv_obj_t * obj, lv_coord_t dx, lv_coord_t dy, lv_anim_enab
res = lv_event_send(obj, LV_EVENT_SCROLL_BEGIN, NULL); res = lv_event_send(obj, LV_EVENT_SCROLL_BEGIN, NULL);
if(res != LV_RES_OK) return; if(res != LV_RES_OK) return;
res = scroll_by_raw(obj, dx, dy); res = _lv_obj_scroll_by_raw(obj, dx, dy);
if(res != LV_RES_OK) return; if(res != LV_RES_OK) return;
res = lv_event_send(obj, LV_EVENT_SCROLL_END, NULL); res = lv_event_send(obj, LV_EVENT_SCROLL_END, NULL);
@ -410,6 +409,23 @@ void lv_obj_scroll_to_view_recursive(lv_obj_t * obj, lv_anim_enable_t anim_en)
} }
} }
lv_res_t _lv_obj_scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
{
if(x == 0 && y == 0) return LV_RES_OK;
lv_obj_allocate_spec_attr(obj);
obj->spec_attr->scroll.x += x;
obj->spec_attr->scroll.y += y;
lv_obj_move_children_by(obj, x, y, true);
lv_res_t res = lv_event_send(obj, LV_EVENT_SCROLL, NULL);
if(res != LV_RES_OK) return res;
lv_obj_invalidate(obj);
return LV_RES_OK;
}
bool lv_obj_is_scrolling(const lv_obj_t * obj) bool lv_obj_is_scrolling(const lv_obj_t * obj)
{ {
lv_indev_t * indev = lv_indev_get_next(NULL); lv_indev_t * indev = lv_indev_get_next(NULL);
@ -652,30 +668,15 @@ void lv_obj_readjust_scroll(lv_obj_t * obj, lv_anim_enable_t anim_en)
* STATIC FUNCTIONS * STATIC FUNCTIONS
**********************/ **********************/
static lv_res_t scroll_by_raw(lv_obj_t * obj, lv_coord_t x, lv_coord_t y)
{
if(x == 0 && y == 0) return LV_RES_OK;
lv_obj_allocate_spec_attr(obj);
obj->spec_attr->scroll.x += x;
obj->spec_attr->scroll.y += y;
lv_obj_move_children_by(obj, x, y, true);
lv_res_t res = lv_event_send(obj, LV_EVENT_SCROLL, NULL);
if(res != LV_RES_OK) return res;
lv_obj_invalidate(obj);
return LV_RES_OK;
}
static void scroll_x_anim(void * obj, int32_t v) static void scroll_x_anim(void * obj, int32_t v)
{ {
scroll_by_raw(obj, v + lv_obj_get_scroll_x(obj), 0); _lv_obj_scroll_by_raw(obj, v + lv_obj_get_scroll_x(obj), 0);
} }
static void scroll_y_anim(void * obj, int32_t v) static void scroll_y_anim(void * obj, int32_t v)
{ {
scroll_by_raw(obj, 0, v + lv_obj_get_scroll_y(obj)); _lv_obj_scroll_by_raw(obj, 0, v + lv_obj_get_scroll_y(obj));
} }
static void scroll_anim_ready_cb(lv_anim_t * a) static void scroll_anim_ready_cb(lv_anim_t * a)

View File

@ -15,6 +15,7 @@ extern "C" {
*********************/ *********************/
#include "../misc/lv_area.h" #include "../misc/lv_area.h"
#include "../misc/lv_anim.h" #include "../misc/lv_anim.h"
#include "../misc/lv_types.h"
/********************* /*********************
* DEFINES * DEFINES
@ -248,6 +249,18 @@ void lv_obj_scroll_to_view(struct _lv_obj_t * obj, lv_anim_enable_t anim_en);
*/ */
void lv_obj_scroll_to_view_recursive(struct _lv_obj_t * obj, lv_anim_enable_t anim_en); void lv_obj_scroll_to_view_recursive(struct _lv_obj_t * obj, lv_anim_enable_t anim_en);
/**
* Low level function to scroll by given x and y coordinates.
* `LV_EVENT_SCROLL` is sent.
* @param obj pointer to an object to scroll
* @param x pixels to scroll horizontally
* @param y pixels to scroll vertically
* @return `LV_RES_INV`: to object was deleted in `LV_EVENT_SCROLL`;
* `LV_RES_OK`: if the object is still valid
*/
lv_res_t _lv_obj_scroll_by_raw(struct _lv_obj_t * obj, lv_coord_t x, lv_coord_t y);
/** /**
* Tell whether an object is being scrolled or not at this moment * Tell whether an object is being scrolled or not at this moment
* @param obj pointer to an object * @param obj pointer to an object