1def scroll_event_cb(e):
2
3    cont = e.get_target()
4
5    cont_a = lv.area_t()
6    cont.get_coords(cont_a)
7    cont_y_center = cont_a.y1 + cont_a.get_height() // 2
8
9    r = cont.get_height() * 7 // 10
10
11    child_cnt = cont.get_child_cnt()
12    for i in range(child_cnt):
13        child = cont.get_child(i)
14        child_a = lv.area_t()
15        child.get_coords(child_a)
16
17        child_y_center = child_a.y1 + child_a.get_height() // 2
18
19        diff_y = child_y_center - cont_y_center
20        diff_y = abs(diff_y)
21
22        # Get the x of diff_y on a circle.
23
24        # If diff_y is out of the circle use the last point of the circle (the radius)
25        if diff_y >= r:
26            x = r
27        else:
28            # Use Pythagoras theorem to get x from radius and y
29            x_sqr = r * r - diff_y * diff_y
30            res = lv.sqrt_res_t()
31            lv.sqrt(x_sqr, res, 0x8000)   # Use lvgl's built in sqrt root function
32            x = r - res.i
33
34        # Translate the item by the calculated X coordinate
35        child.set_style_translate_x(x, 0)
36
37        # Use some opacity with larger translations
38        opa = lv.map(x, 0, r, lv.OPA.TRANSP, lv.OPA.COVER)
39        child.set_style_opa(lv.OPA.COVER - opa, 0)
40
41#
42# Translate the object as they scroll
43#
44
45cont = lv.obj(lv.scr_act())
46cont.set_size(200, 200)
47cont.center()
48cont.set_flex_flow(lv.FLEX_FLOW.COLUMN)
49cont.add_event_cb(scroll_event_cb, lv.EVENT.SCROLL, None)
50cont.set_style_radius(lv.RADIUS.CIRCLE, 0)
51cont.set_style_clip_corner(True, 0)
52cont.set_scroll_dir(lv.DIR.VER)
53cont.set_scroll_snap_y(lv.SCROLL_SNAP.CENTER)
54cont.set_scrollbar_mode(lv.SCROLLBAR_MODE.OFF)
55
56for i in range(20):
57    btn = lv.btn(cont)
58    btn.set_width(lv.pct(100))
59
60    label = lv.label(btn)
61    label.set_text("Button " + str(i))
62
63    # Update the buttons position manually for first*
64    lv.event_send(cont, lv.EVENT.SCROLL, None)
65
66    # Be sure the fist button is in the middle
67    #lv.obj.scroll_to_view(cont.get_child(0), lv.ANIM.OFF)
68    cont.get_child(0).scroll_to_view(lv.ANIM.OFF)
69