отметьте это Getting-Start-with-Brightscript-Screen-Navigation
Реализация простого меню навигации
На скриншоте ниже показана целевая страница, типичная для многих каналов Roku. Компонент экрана списка является распространенным способом реализации простых меню, которые управляют навигацией по содержимому канала. Каждый элемент списка может представлять жанр видео, музыкальный стиль, группу настроек или любую другую категорию контента, которую вы хотите сгруппировать в своем канале. В типичном канале, когда выбран элемент списка, канал переходит на новый экран. В нашем примере экран списка позволяет пользователю просматривать меню завтрака и обеда в гипотетической закусочной. Выбор одного из пунктов приводит к подробному списку предложений для данной категории блюд.
Ключом к переходу на новый экран при выборе элемента списка является обработка события isListItemSelected экрана списка. Индекс, возвращаемый функцией msg.GetIndex (), содержит нулевой индекс выбранного элемента списка. Ваш канал может отобразить каждый индекс элемента списка на уникальный экран и перейти к этому экрану в ответ на событие isListItemSelected. Есть несколько способов сделать это. Самое простое - просто использовать подход оператора if в цикле событий экрана вызова, который проверяет выбранный индекс и вызывает нужную функцию:
while (true)
msg = wait(0, port)
if (type(msg) = "roListScreenEvent")
if (msg.isListItemSelected())
index = msg.GetIndex()
if (index = 0)
ShowBreakfastMenu()
else if (index = 1)
ShowLunchMenu()
…
endif
endif
endif
end while
Еще один более сложный, но более понятный способ сделать это - создать массив ссылок на функции.
menuFunctions = [ShowBreakfastMenu, ShowLunchMenu,…]
while (true)
msg = wait(0, port)
if (type(msg) = "roListScreenEvent")
if (msg.isListItemSelected())
menuFunctions[msg.GetIndex()]() ‘Call function based on index
endif
endif
end while
Ключ к пониманию того, как работает этот код, лежит в справочной концепции функции BrightScript. Ссылка на функцию - это просто имя данной функции. Ссылки на функции могут быть присвоены переменным, использованы в качестве элементов массива и даже переданы другим функциям. Функция, которая соответствует ссылке на функцию, может быть вызвана с помощью оператора вызова функции «()». Вот несколько примеров вызова функции doSomething по ссылке:
Function doSomething() as void
...
End Function
doSomethingReference = doSomething
‘Call doSomething by reference
doSomethingReference()
references = [doSomething, …]
‘Мы также можем помещать ссылки на функции в массив
reference0 ‘Вызвать doSomething через ссылку на функцию элемента массива
Имея это в виду, давайте вернемся ко второму подходу к реализации меню на экране просмотра списка. Массив menuFunctions содержит название каждой функции создания экрана канала. Они расположены в том же порядке, что и элементы списка, которым они соответствуют на экране связанного списка. Затем, когда событие isListItemSelected обрабатывается в цикле событий экрана списка, мы получаем соответствующее имя функции из массива menuFunctions. Затем функция вызывается по ссылке, используя оператор «()» для правильного элемента массива:
menuFunctions[msg.GetIndex()]()
‘Вызов функции на основе индекса
В примере канала мы используем подход функции ссылки. Чтобы увидеть, что на самом деле делают пункты меню, щелкните пункт меню «Завтрак», и вы увидите подробное меню завтрака, представленное на простом экране плаката:
При нажатии на элемент меню Обед отображается подробное меню обеда, которое реализуется с использованием экрана сетки:
Более глубокая навигация
До сих пор мы рассматривали, как использовать экран списка для создания простой навигации по категориям в канале. Переход с экранов, таких как экраны с плакатами или выше, на другие экраны в вашем канале также прост. Просто обработайте событие isListItemSelected в цикле событий экрана, чтобы определить, когда элемент выбран, и ответить соответствующим образом.
В примере канала вы можете щелкнуть любой из элементов на экране плаката меню завтрака, чтобы отобразить экран сведений с дополнительной информацией о выбранном элементе. Пример этого экрана (также называемый «трамплином») показан ниже:
Две кнопки справаэтого экрана демонстрирует другую технику навигации BrightScript. Когда выбрана одна из этих кнопок, экран сведений получает событие isButtonPressed. Сообщение, отправленное с событием, содержит индекс выбранной кнопки. Как и в случае с индексами элементов списка, плаката и сетки, этот индекс кнопки можно использовать для управления действиями канала в ответ на нажатие кнопки, включая переход на новые экраны, открытие диалоговых окон и другие действия.
while (true)
msg = wait(0, port)
if (type(msg) = "roSpringboardScreenEvent")
if (msg.isButtonPressed())
buttonIndex = msg.GetIndex()
'Open a new screen corresponding to the button index
…
endif
endif
end while
Чтобы попытаться свести к минимуму объем загрузки примера канала, только элементы экрана завтрака и обеда открывают экраны плакатов или сетки. Кроме того, можно щелкнуть только элементы экрана плаката меню завтрака, чтобы открыть подробные экраны. Вы можете легко использовать эти две категории в качестве руководства для самостоятельного создания канала. Или вы можете просто использовать код, чтобы начать навигацию по своим каналам. Удачного кодирования!