2016-07-21 6 views
2

Я хочу создать бесконечный свиток для своего приложения. Это мой код:Kivy бесконечный свиток

from kivy.app import App 
from kivy.uix.scrollview import ScrollView 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.image import AsyncImage 


IMAGES_URLS = ['https://upload.wikimedia.org/wikipedia/commons/c/c3/Jordan_by_Lipofsky_16577.jpg' for _ in range(5)] 


def upload_images(widget): 
    layout = widget.children[0] 
    layout_childrens = len(layout.children) 
    for url in IMAGES_URLS: 
     img = AsyncImage(source=url, size_hint_y=None, height=240) 
     layout.add_widget(img) 
    widget.scroll_y = 100 - (100 * layout_childrens/(layout_childrens + len(IMAGES_URLS))) 


class InfinityScrollView(ScrollView): 
    def on_scroll_move(self, touch): 
     if self.scroll_y < 0: 
      upload_images(self) 
     return super(InfinityScrollView, self).on_scroll_move(touch) 


class InfiniteScrollApp(App): 
    def build(self): 
     layout = GridLayout(cols=1, spacing=10, size_hint_y=None) 
     layout.bind(minimum_height=layout.setter('height')) 
     for url in IMAGES_URLS: 
      img = AsyncImage(source=url, size_hint_y=None, 
          height=240) 
      layout.add_widget(img) 
     root = InfinityScrollView(size_hint=(None, None), size=(400, 400), 
            pos_hint={'center_x': .5, 'center_y': .5}) 
     root.add_widget(layout) 
     return root 


if __name__ == '__main__': 
    InfiniteScrollApp().run() 

Я отменяю on_scroll_move метод и когда свиток на дне я назвал метод, который добавляет новые изображения.

Это нормально работает, но у меня возникла проблема с тем, что положение прокрутки остается внизу после загрузки изображения, но я хочу перенести его на первые загруженные изображения.

Я попытался установить правильное значение scroll_y, но это не сработает, возможно, я также должен назвать какой-то метод или изменить другие переменные. Какие-нибудь советы?

+2

Для бесконечного набора подобных широкоугольных изображений попробуйте RecycleView. Он будет эффективно управлять вещами для вас. – inclement

ответ

2

Я нашел решение, мне нужно было переопределить 2 переменные (scroll_y и effect_y). Это вопрос на github, где я нашел решение. Это мой фиксированный код.

def upload_images(self): 
    layout = self.children[0] 
    layout_childrens = len(layout.children) 
    for url in IMAGES_URLS: 
     img = AsyncImage(source=url, size_hint_y=None, height=240) 
     layout.add_widget(img) 
    bar_position = layout_childrens/(layout_childrens + len(IMAGES_URLS)) 
    self.scroll_y = 100 - 100 * bar_position 
    self.effect_y.value = self.effect_y.min - self.effect_y.min * bar_position