Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from kivy.config import Config
- Config.set('graphics', 'width', '360')
- Config.set('graphics', 'height', '640')
- Config.set('graphics', 'resizable', '0')
- from kivy.app import App
- from kivy.lang import Builder
- from kivy.animation import Animation
- from kivy.core.window import Window
- from kivy.metrics import dp
- from kivy.uix.boxlayout import BoxLayout
- from kivy.clock import Clock
- Builder.load_string('''
- <SearchAppUI>:
- orientation: 'vertical'
- spacing: dp(5)
- # Плашка результатов (изначально свернута)
- BoxLayout:
- id: result_panel
- size_hint_y: None
- height: 0
- opacity: 0
- canvas.before:
- Color:
- rgba: 0.2, 0.8, 0.4, 0.9
- Rectangle:
- pos: self.pos
- size: self.size
- Label:
- id: result_label
- text: 'Результат поиска'
- color: 1, 1, 1, 1
- font_size: dp(18)
- bold: True
- halign: 'center'
- # Основная область контента
- ScrollView:
- id: main_scroll
- size_hint_y: 1
- do_scroll_y: not search_panel.is_raised
- BoxLayout:
- orientation: 'vertical'
- size_hint_y: None
- height: self.minimum_height
- Label:
- text: 'Основной контент приложения\\n\\n' * 20
- size_hint_y: None
- height: self.texture_size[1]
- padding: dp(10), dp(10)
- # Поисковая панель (внизу)
- BoxLayout:
- id: search_panel
- size_hint_y: None
- height: dp(60)
- pos_hint: {'x': 0, 'y': 0}
- padding: dp(10)
- spacing: dp(5)
- is_raised: False
- TextInput:
- id: search_input
- hint_text: 'Введите запрос...'
- multiline: False
- size_hint_x: 0.8
- padding: [dp(10), (self.height - self.line_height)/2]
- font_size: dp(16)
- on_focus: root.on_search_focus(*args)
- Button:
- text: 'Найти'
- size_hint_x: 0.2
- font_size: dp(16)
- on_press: root.do_search()
- ''')
- class SearchAppUI(BoxLayout):
- def __init__(self, **kwargs):
- super().__init__(**kwargs)
- Window.bind(on_keyboard=self.on_keyboard)
- self.keyboard_height = dp(300)
- def on_search_focus(self, instance, focused):
- if focused:
- # Поднимаем панель над клавиатурой
- self.ids.search_panel.is_raised = True
- Animation(
- y=self.keyboard_height + dp(10),
- duration=0.2,
- t='out_quad'
- ).start(self.ids.search_panel)
- # Прокручиваем контент вниз
- Animation(
- scroll_y=0,
- duration=0.3
- ).start(self.ids.main_scroll)
- else:
- # Опускаем панель обратно
- self.ids.search_panel.is_raised = False
- Animation(
- y=0,
- duration=0.2,
- t='out_quad'
- ).start(self.ids.search_panel)
- def do_search(self):
- query = self.ids.search_input.text
- if not query:
- return
- # Обновляем текст результата
- self.ids.result_label.text = f"Найдено: {query}"
- # Показываем плашку
- self.ids.search_input.focus = False
- anim = Animation(height=dp(50), opacity=1, duration=0.3)
- anim.start(self.ids.result_panel)
- # Через 3 секунды скрываем
- Clock.schedule_once(self.hide_panel, 3)
- def hide_panel(self, dt):
- Animation(height=0, opacity=0, duration=0.3).start(self.ids.result_panel)
- def on_keyboard(self, window, key, *args):
- if key == 27: # ESC
- self.ids.search_input.focus = False
- return True
- class SearchApp(App):
- def build(self):
- Window.clearcolor = (0.4, 0.4, 0.4, 1)
- return SearchAppUI()
- if __name__ == '__main__':
- SearchApp().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement