
Здравствуйте!
Хотел бы продолжить делиться впечатлениями о разработке приложений под платформу 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 только хуже


# Создаем кнопки для выпадающего списка 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 ответить