Здравствуйте!
Хотел бы продолжить делиться впечатлениями о разработке приложений под платформу Android с использованием фрейворка Kivy. На примере разрабатываемого мною клиента HeaTDV4A для сайта dimonvideo.ru в прошлой статье были рассмотрены такие полезные виджеты, как Label, BoxLayout, Button, Image. Сегодня уделим вниманиеActionBar, ActionOverflow, ActionButton, ActionGroup для построения такой нужной и функциональной части интерфейса программы, как ActionBar!
Как вы можете видеть, это панель в нижней части экрана приложения, без которой не обходится почти ни одно приложение на Android. Мы можем размещать на панели кнопки, выпадающие списки меню и другие функциональные виджеты. Данный экран — это видоизмененный интерфейс приложения HeaTDV4A из первой части статьи. Такой макет вы увидите, если запустите новую версию startscreen.py из папки ./Libs/ui директории приложения, архив которого прилагается ниже.
Но давайте ближе к делу, и рассмотрим код startscreen.py:\
Поскольку все это мы рассматривали ранее, разберем лишь некоторую часть кода: создание ActionBar и создание переменных с использованием kivy.properties.
Итак, строки 54-77:
Собственно бар.
action = ActionBar()
Контейнер для контента бара:
action_view = ActionView(use_seperator=True)
Контейнер, куда мы поместим иконку и имя бара.
Параметры:
app_icon='Путь к иконке'
title='Имя бара'
previous_image='Путь к иконке превью'
with_previous - указывает, нажав на ActionPrevious будет ли загрузжен предыдущий экран или нет. Если True, он будет отображен в previous_icon.
action_previous = ActionPrevious(app_icon=self.previous,
title=self.title_previous,
previous_image=self.previous_image,
with_previous=True, id="previous",
on_press=self.events_screen)
Контейнер (выпадающий список кнопок), в который мы добавим пункты меню нашего приложения:
action_overflow = ActionOverflow(overflow_image=self.overflow_image)
Здесь не будем ничего уточнять, поскольку кнопки ActionButton это почти такие же кнопки, как обычные Button только хуже Вы не можете программно настроить их параметры, кроме как используя Kv Language или создав собственный класс Button производный от ActionItem.
# Создаем кнопки для выпадающего списка ActionOverflow.
for item_name in self.buttons_group:
item_button = ActionButton(text=item_name, id=item_name,
on_press=self.events_screen)
action_overflow.add_widget(item_button)
action_view.add_widget(action_previous)
action_view.add_widget(action_overflow)
ActionGroup — это разделительная вертикальная полоса между которой мы помещаем созданые нами кнопки. Параметр text — это просто своего рода id.
# Создаем кнопки меню в ActionBar.
for path_image in self.buttons_menu:
name_image = os.path.split(path_image)[1].split(".")[0]
action_group = ActionGroup(text=name_image)
button_menu = ActionButton(icon=path_image, id=name_image,
on_press=self.events_screen)
action_group.add_widget(button_menu)
action_view.add_widget(action_group)
В общим и целом получаем вот такой симпатичный функциональный бар:
[center]
action.add_widget(action_view)
action_box.add_widget(action)
Запуск макета со всеми параметрами (список изображений-кнопок, список имен кнопок меню) из файла HeaTDV4A директории программы даст вот такой результат:
[center]
kivy.properties.
Справка от werton:
kivy properties это шаблон, где реализованы полезные удобности, без которых вполне можно обойтись или реализовать их самостоятельно, но зачем это делать, если это уже кто-то постарался за нас. Соответственно, использовать их стоит только там где это оправданно, где требуется манипуляция значениями с контролем их величины и реализацией действий на изменение этих значений (об этом ниже). Как правило, внутри виджетов, все свойства объявляемые в [bkv lang][/b] стиле так же являются properties.
Что дают properties:
1. Это удобное объявление в теле класса, а не внутри метода __init__():
class MyClass(EventDispatcher):
numeric_var = NumericProperty(1)
против:
class MyClass(object):
def __init__(self):
super(MyClass, self).__init__()
self.numeric_var = 1
2. Это реализация метода on_
class CustomBtn(Widget):
custom_value = NumericProperty(0)
def on_custom_value(self, instance, value):
print instance, value
То есть, если ты объявил внутри класса, например, свойство custom_value = ListProperty(0), то в классе автоматически реализовывается метод on_custom_value(self, instance, value), который вызывается при любом изменении значения custom_value, с параметрами instance(ссылка на экземпляр класса) и value (новое значение custom_value).
btn = CustomBtn()
btn.custom_value = 1
Это очень удобно для реализации действий на изменение значений custom_value, например, если теперь изменить custom_value = 1, то в этом месте будет вызван метод on_custom_value(btn, 1).
Так же к custom_value можно привязать свою callback функцию, которые так же будут вызываться при изменении значения custom_value с параметрами instance, value:
def callback_func(instance, value):
print 'My callback is call from', instance
print 'and the a value changed to', value
btn.bind(custom_value=callback_func)
3. Это контроль значений, т.е. properties проверяют тип и величину присеваемого им значения после объявления
вызывая ValueError при его несоответствии.
На этом пока закончим статью, ибо, чувствую, информации уже слишком много для одной статьи. В следующей будут рассмотрены построение панели настроек с помощью .json-файлов и работа с «самодельным» модулем диалоговых окон kdialog.py.
А пока вы можете скачать архив
Скрины тестового приложения:
uncle_smile,
https://habrahabr.ru/users/heattheatr/topics/
0 ответить