检查这个getting-started-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, …]
‘我们也可以把函数引用放在一个数组中
references0 '通过数组元素函数引用调用doSomething
考虑到这一点,让我们回到在列表视图屏幕中实现菜单的第二种方法。数组 menuFunctions 包含每个通道的屏幕创建函数的名称。这些与它们在相关列表屏幕中对应的列表项的顺序相同。然后,当在列表屏幕的事件循环中处理 isListItemSelected 事件时,我们从 menuFunctions 数组中获取相应的函数名称。然后在正确的数组元素上使用“()”运算符通过引用调用该函数:
menuFunctions[msg.GetIndex()]()'根据索引调用函数
在示例通道中,我们使用函数引用方法。要查看菜单项的实际作用,请单击早餐菜单项,您会在一个简单的海报屏幕中看到详细的早餐菜单:
单击“午餐”菜单项会显示详细的午餐菜单,这是使用网格屏幕实现的:
更深入的导航
到目前为止,我们已经了解了如何使用列表屏幕将简单的类别导航构建到频道中。从上面的海报或网格屏幕等屏幕移动到频道中的其他屏幕同样容易。只需在屏幕的事件循环中处理 isListItemSelected 事件,即可检测项目何时被选中并做出适当响应。
在示例频道中,您可以单击早餐菜单海报屏幕中的任何项目以显示详细信息屏幕,其中包含有关所选项目的更多信息。此屏幕的示例(也称为“跳板”屏幕)如下所示:
此屏幕右侧的两个按钮演示了另一种 BrightScript 导航技术。 When one of these buttons is selected, the details screen receives an isButtonPressed event.与事件一起发送的消息包含所选按钮的索引。与列表、海报和网格屏幕项目索引一样,此按钮索引可用于控制通道响应按钮按下的操作,包括导航到新屏幕、打开对话框和其他操作。
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
为了尽量减少示例频道下载的大小,只有早餐和午餐列表屏幕项目打开海报或网格屏幕。此外,只有早餐菜单海报屏幕项目可以点击打开详细屏幕。您可以轻松地使用这两个类别作为指南,自行完成频道。或者,您可以按原样使用代码开始在您自己的频道中导航。编码愉快!