diff --git a/examples/scroll/index.rst b/examples/scroll/index.rst index dff8e1409..524f2f8f6 100644 --- a/examples/scroll/index.rst +++ b/examples/scroll/index.rst @@ -27,6 +27,11 @@ Right to left scrolling .. lv_example:: scroll/lv_example_scroll_5 :language: c +Translate on scroll +"""""""""""""""""""""""" +.. lv_example:: scroll/lv_example_scroll_6 + :language: c + MicroPython ^^^^^^^^^^^ diff --git a/examples/scroll/lv_example_scroll_6.c b/examples/scroll/lv_example_scroll_6.c new file mode 100644 index 000000000..1fcd5fa5b --- /dev/null +++ b/examples/scroll/lv_example_scroll_6.c @@ -0,0 +1,77 @@ +#include "../lv_examples.h" +#if LV_BUILD_EXAMPLES + +static void scroll_event_cb(lv_event_t * e) +{ + lv_obj_t * cont = lv_event_get_target(e); + + lv_area_t cont_a; + lv_obj_get_coords(cont, &cont_a); + lv_coord_t cont_y_center = cont_a.y1 + lv_area_get_height(&cont_a) / 2; + + lv_coord_t r = lv_obj_get_height(cont) * 7 / 10; + uint32_t i; + uint32_t child_cnt = lv_obj_get_child_cnt(cont); + for(i = 0; i < child_cnt; i++) { + lv_obj_t * child = lv_obj_get_child(cont, i); + lv_area_t child_a; + lv_obj_get_coords(child, &child_a); + + lv_coord_t child_y_center = child_a.y1 + lv_area_get_height(&child_a) / 2; + + lv_coord_t diff_y = child_y_center - cont_y_center; + diff_y = LV_ABS(diff_y); + + /*Get the x of diff_y on a circle.*/ + lv_coord_t x; + /*If diff_y is out of the circle use the last point of the circle (the radius)*/ + if(diff_y >= r) { + x = r; + } else { + /*Use Pythagoras theorem to get x from radius and y*/ + lv_coord_t x_sqr = r * r - diff_y * diff_y; + lv_sqrt_res_t res; + lv_sqrt(x_sqr, &res, 0x8000); /*Use lvgl's built in sqrt root function*/ + x = r - res.i; + } + + /*Translate the item by the calculated X coordinate*/ + lv_obj_set_style_translate_x(child, x, 0); + + /*Use some opacity with larger translations*/ + lv_opa_t opa = lv_map(x, 0, r, LV_OPA_TRANSP, LV_OPA_COVER); + lv_obj_set_style_opa(child, LV_OPA_COVER - opa, 0); + } +} + +/** + * Translate the object as they scroll + */ +void lv_example_scroll_6(void) +{ + lv_obj_t * cont = lv_obj_create(lv_scr_act()); + lv_obj_set_size(cont, 200, 200); + lv_obj_center(cont); + lv_obj_set_flex_flow(cont, LV_FLEX_FLOW_COLUMN); + lv_obj_add_event_cb(cont, scroll_event_cb, LV_EVENT_SCROLL, NULL); + lv_obj_set_style_radius(cont, LV_RADIUS_CIRCLE, 0); + lv_obj_set_style_clip_corner(cont, true, 0); + lv_obj_set_scroll_dir(cont, LV_DIR_VER); + lv_obj_set_scroll_snap_y(cont, LV_SCROLL_SNAP_CENTER); + lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF); + + uint32_t i; + for(i = 0; i < 20; i++) { + lv_obj_t * btn = lv_btn_create(cont); + lv_obj_set_width(btn, lv_pct(100)); + + lv_obj_t * label = lv_label_create(btn); + lv_label_set_text_fmt(label, "Button %d", i); + } + + /*Update the buttons position manually for first*/ + lv_obj_update_layout(cont); + lv_event_send(cont, LV_EVENT_SCROLL, NULL); +} + +#endif