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:
parent
e5c11f1f68
commit
25ce6e3ae9
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user