Advertisement
soulseb

prim

Jun 10th, 2025 (edited)
761
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.49 KB | None | 0 0
  1. from kivy.app import App
  2. from kivy.lang import Builder
  3. from kivy.uix.boxlayout import BoxLayout
  4. from kivy.animation import Animation
  5. from kivy.core.window import Window
  6. from kivy.metrics import dp
  7.  
  8. Builder.load_string('''
  9. <FloatingSearch>:
  10.    orientation: 'vertical'
  11.    
  12.    # Основной контент (занимает всё пространство)
  13.    ScrollView:
  14.        id: scroll
  15.        size_hint_y: None
  16.        height: root.height
  17.        
  18.        BoxLayout:
  19.            size_hint_y: None
  20.            height: self.minimum_height
  21.            orientation: 'vertical'
  22.            
  23.            Label:
  24.                size_hint_y: None
  25.                height: dp(200)
  26.                text: 'Контент приложения'
  27.            
  28.            # Добавим много контента, чтобы можно было скроллить
  29.            BoxLayout:
  30.                size_hint_y: None
  31.                height: dp(2000)
  32.    
  33.    # Плавающая поисковая строка
  34.    BoxLayout:
  35.        id: search_box
  36.        size_hint_y: None
  37.        height: dp(60)
  38.        pos_hint: {'x': 0, 'y': 0}
  39.        padding: dp(10)
  40.        canvas.before:
  41.            Color:
  42.                rgba: 0.2, 0.2, 0.2, 1
  43.            Rectangle:
  44.                pos: self.pos
  45.                size: self.size
  46.        
  47.        TextInput:
  48.            id: search_input
  49.            size_hint_x: 0.8
  50.            hint_text: 'Поиск...'
  51.            multiline: False
  52.            focus: False
  53.            on_focus: root.on_search_focus(*args)
  54.        
  55.        Button:
  56.            size_hint_x: 0.2
  57.            text: 'Найти'
  58.            on_press: root.search()
  59. ''')
  60.  
  61. class FloatingSearch(BoxLayout):
  62.     def __init__(self, **kwargs):
  63.         super().__init__(**kwargs)
  64.         Window.bind(on_keyboard=self._keyboard_handler)
  65.         self.keyboard_height = 0
  66.         self.original_y = 0
  67.    
  68.     def on_search_focus(self, instance, value):
  69.         if value:  # Когда поле получает фокус
  70.             # Получаем высоту клавиатуры (примерно 1/3 экрана)
  71.             self.keyboard_height = Window.height * 0.3
  72.             self.original_y = self.ids.search_box.y
  73.            
  74.             # Анимируем поднятие поисковой строки
  75.             Animation(
  76.                 y=self.keyboard_height + dp(10),
  77.                 d=0.2,
  78.                 t='out_quad'
  79.             ).start(self.ids.search_box)
  80.            
  81.             # Прокручиваем ScrollView, чтобы поле было видно
  82.             Animation(
  83.                 scroll_y=0,
  84.                 d=0.3
  85.             ).start(self.ids.scroll)
  86.         else:  # Когда поле теряет фокус
  87.             Animation(
  88.                 y=self.original_y,
  89.                 d=0.2,
  90.                 t='out_quad'
  91.             ).start(self.ids.search_box)
  92.    
  93.     def search(self):
  94.         print("Поиск:", self.ids.search_input.text)
  95.         self.ids.search_input.focus = False
  96.    
  97.     def _keyboard_handler(self, window, key, *args):
  98.         # Закрываем клавиатуру при нажатии Escape
  99.         if key == 27:  # Код клавиши Escape
  100.             self.ids.search_input.focus = False
  101.             return True
  102.         return False
  103.  
  104. class SearchApp(App):
  105.     def build(self):
  106.         return FloatingSearch()
  107.  
  108. if __name__ == '__main__':
  109.     SearchApp().run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement