Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from kivy.app import App
- from kivy.lang import Builder
- from kivy.uix.boxlayout import BoxLayout
- from kivy.animation import Animation
- from kivy.core.window import Window
- from kivy.metrics import dp
- Builder.load_string('''
- <FloatingSearch>:
- orientation: 'vertical'
- # Основной контент (занимает всё пространство)
- ScrollView:
- id: scroll
- size_hint_y: None
- height: root.height
- BoxLayout:
- size_hint_y: None
- height: self.minimum_height
- orientation: 'vertical'
- Label:
- size_hint_y: None
- height: dp(200)
- text: 'Контент приложения'
- # Добавим много контента, чтобы можно было скроллить
- BoxLayout:
- size_hint_y: None
- height: dp(2000)
- # Плавающая поисковая строка
- BoxLayout:
- id: search_box
- size_hint_y: None
- height: dp(60)
- pos_hint: {'x': 0, 'y': 0}
- padding: dp(10)
- canvas.before:
- Color:
- rgba: 0.2, 0.2, 0.2, 1
- Rectangle:
- pos: self.pos
- size: self.size
- TextInput:
- id: search_input
- size_hint_x: 0.8
- hint_text: 'Поиск...'
- multiline: False
- focus: False
- on_focus: root.on_search_focus(*args)
- Button:
- size_hint_x: 0.2
- text: 'Найти'
- on_press: root.search()
- ''')
- class FloatingSearch(BoxLayout):
- def __init__(self, **kwargs):
- super().__init__(**kwargs)
- Window.bind(on_keyboard=self._keyboard_handler)
- self.keyboard_height = 0
- self.original_y = 0
- def on_search_focus(self, instance, value):
- if value: # Когда поле получает фокус
- # Получаем высоту клавиатуры (примерно 1/3 экрана)
- self.keyboard_height = Window.height * 0.3
- self.original_y = self.ids.search_box.y
- # Анимируем поднятие поисковой строки
- Animation(
- y=self.keyboard_height + dp(10),
- d=0.2,
- t='out_quad'
- ).start(self.ids.search_box)
- # Прокручиваем ScrollView, чтобы поле было видно
- Animation(
- scroll_y=0,
- d=0.3
- ).start(self.ids.scroll)
- else: # Когда поле теряет фокус
- Animation(
- y=self.original_y,
- d=0.2,
- t='out_quad'
- ).start(self.ids.search_box)
- def search(self):
- print("Поиск:", self.ids.search_input.text)
- self.ids.search_input.focus = False
- def _keyboard_handler(self, window, key, *args):
- # Закрываем клавиатуру при нажатии Escape
- if key == 27: # Код клавиши Escape
- self.ids.search_input.focus = False
- return True
- return False
- class SearchApp(App):
- def build(self):
- return FloatingSearch()
- if __name__ == '__main__':
- SearchApp().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement