【问题标题】:Kivy, ScrollView scrolls automatically when contents change sizeKivy,当内容改变大小时,ScrollView 会自动滚动
【发布时间】:2021-05-17 06:32:11
【问题描述】:

我在 ScrollView 中有一个 GridLayout。 GridLayout 包含大约 25 个图像。图像是在运行时选择的,因此无法事先确定它们的大小。这些图像在不同时间异步加载(它们之间至少有 500 毫秒的差异)。

当图片加载完毕,GridLayout 的大小发生变化时,就会出现这个问题。据我了解,ScrollView 的scroll_y 设置为相对于GridLayout 的原始高度的某个值。然后,一旦图像加载,GridLayout 的大小就会发生变化,但 scroll_y 仍然相对于旧高度。这会导致 ScrollView 向下滚动很多。

我已尝试通过手动更改 scroll_y 以匹配新高度来纠正此问题。我正在使用以下等式:

Equation for Finding New Scroll_Y

我正在从 1 中减去 scroll_y,因为滚动值 1 位于 kivy 的最顶端。我已将此等式重新排序为以下内容并在代码中实现了这一点:

Simplified Equation for Finding New Scroll_Y

这减少了问题,并且抖动不太明显,但每次加载图像时它仍然向上滚动 5-10 像素。

这是因为我正在计算方程式的新高度,基于:

  • ScrollView 的旧视口高度
  • 图像小部件的旧高度
  • 图片的新高度。

但是,这个计算出的高度比实际高度略大,导致我调整后的scroll_y 略有偏差。我不确定为什么实际高度更小。

我不知道从这里去哪里。

这里是一个存储库的链接,其中包含一个最小的可重现示例。 Grid Stuttering Example

【问题讨论】:

  • 如果不提供minimal reproducible example,您不可能就此类问题获得任何帮助。
  • 抱歉,我编辑了我的问题以包含一个。

标签: python kivy


【解决方案1】:

我相信做你想做的最简单的方法是扩展ScrollView。这是一个扩展 ScrollView 的类,可以满足您的要求:

class ScrollViewNoStutter(ScrollView):
    child_height = NumericProperty(0)

    def add_widget(self, widget, index=0):
        super(ScrollViewNoStutter, self).add_widget(widget, index=index)
        widget.bind(size=self.child_size_changed)

    def remove_widget(self, widget):
        super(ScrollViewNoStutter, self).remove_widget(widget)
        widget.unbind(size=self.child_size_changed)

    def child_size_changed(self, child, new_child_size):
        if new_child_size[1] > self.size[1]:
            # re-calculate scroll_y

            # calculate distance between scrollview top and child top (in pixels)
            y_dist = (1.0 - self.scroll_y) * (self.child_height - self.height)

            # calculate new scroll_y that reproduces the above distance
            self.scroll_y = 1.0 - y_dist / (new_child_size[1] - self.height)

        self.child_height = new_child_size[1]

只需使用这个类代替ScrollView,您就不需要在App 中进行任何这些计算。

【讨论】:

    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2021-10-31
    相关资源
    最近更新 更多