”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > React Native 中管理焦点的方法

React Native 中管理焦点的方法

发布于2024-11-08
浏览:996

当涉及到在电视应用程序的 React Native 中处理焦点管理时,开发人员可能会发现自己正在经历五个熟悉的阶段(悲伤):? ? ? ? ?

焦点管理是电视应用程序开发中的一个独特挑战,因为电视平台的碎片化导致了各种焦点管理技术的出现。开发人员被迫创建并采用多种策略来管理焦点,通常需要兼顾特定于平台的解决方案和跨平台抽象。焦点的挑战不仅在于确保正确处理焦点,还在于处理平台差异。 Android TV 和 Apple 的 tvOS 具有不同的本机焦点引擎,您可以在我的同事 @hellonehha 撰写的这篇文章中阅读更多相关信息。

ays Of Managing Focus In React Native

最初,特定于 TV 的文档和 API 是主要 React Native 文档的一部分。现在,大多数电视特定内容已转移到react-native-tvos项目。

ays Of Managing Focus In React Native

反应本机 tvos

"react-native": "npm:react-native-tvos@latest"

react-native-tvos 项目是一个开源包,为核心 React Native 框架提供补充和扩展,特别关注支持 Apple TV 和 Android TV 平台。该项目中的大部分变化都集中在使用遥控器上的方向键在智能电视上处理基于焦点的导航。该项目由(令人难以置信的!)Doug Lowder 维护,并且通常被推荐作为在 React Native TV 应用程序中处理焦点管理的主要方式。

然而,与许多社区维护的项目一样,react-native-tvos 项目是根据开发人员的需求而发展的,现在有多种方法来处理焦点。让我们探索一下 React-native-tvos 提供的附加组件和现有组件的增强功能:

1.TVFocusGuideView

TVFocusGuideView 提供对 Apple 的 UIFocusGuide API 的支持,并以与 Android TV 相同的方式实现,以帮助确保可以导航到可聚焦控件,即使它们不直接与其他控件对齐 -根据react-native-tvos。

例如,这是在 TVFocusGuideView 组件内呈现的由 10 个可压组件组成的网格:

import { TVFocusGuideView } from 'react-native';

const TVFocusGuideViewExample = () => {
  const [focusedItem, setFocusedItem] = useState(null);

  const renderGridItem = number => (
     setFocusedItem(number)}
      onBlur={() => setFocusedItem(null)}>
      {number}
    
  );

  return (
    
      
{[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(num => renderGridItem(num))} > ); };

ays Of Managing Focus In React Native

TVFocusGuideView 接受一些帮助您处理焦点的道具:

目的地道具


使用 TVFocusGuideView,您可以设置一组组件来注册为 TVFocusGuideView 的“目的地”。 让我们看看我们的例子:

  • 将目的地属性设置为对项目 8 的引用 (destinations={[item8Ref.current]}) 会导致当我们最初导航到 TVFocusGuideView 时焦点移动到项目 8。

ays Of Managing Focus In React Native

trapFocus 道具


此属性确保焦点不会从给定方向的父组件中逃逸。该属性确保焦点不会从给定方向的父组件中逃逸。让我们看看我们的例子:

  • 使用 trapFocusLeft 属性,您将无法再从容器中向左导航

ays Of Managing Focus In React Native

自动对焦支柱

 

当自动对焦设置为 true 时,TVFocusGuideView 将通过将焦点重定向到第一个可聚焦的子项来为您管理焦点。它还会记住最后一个关注的孩子,并在后续访问中将焦点重定向到它。如果此属性与目的地属性一起使用,则目的地属性设置的组件将优先。让我们看看我们的例子:

  • 如果没有这个 prop,当我们从 Header 组件移动到 TVFocusGuideView 时,焦点会转到最近的组件 - 第 3 项(根据 Android 基于邻近度的内置焦点引擎)
  • 使用自动对焦道具,它会转到第 1 项

ays Of Managing Focus In React Native

2. 可触摸

使用react-native-tvos,Touchable 组件(TouchableWithoutFeedback、TouchableHighlight 和 TouchableOpacity)包含额外的代码来检测焦点变化并在聚焦时正确设置组件的样式。它还确保当用户使用电视遥控器与可触摸视图交互时触发适当的操作。

具体来说,当 Touchable 视图获得焦点时会触发 onFocus 事件,当视图失去焦点时会触发 onBlur 事件。这使您能够在组件处于焦点状态时应用独特的样式或逻辑,而核心 React Native 并没有开箱即用。

此外,onPress 方法已修改为当用户通过按电视遥控器上的“选择”按钮(Apple TV 遥控器上的中心按钮或 Android TV 方向键上的中心按钮)选择 Touchable 时触发) 并且当按住“select”按钮一定时间时,onLongPress 事件会执行两次。

3. 可按压

与 Touchable 一样,Pressable 组件也得到了增强,可以接受 onFocus 和 onBlur 属性。
与用户在触摸屏上按下组件时触发的“按下”状态类似,react-native-tvos Pressable 组件引入了聚焦状态,当组件聚焦在电视屏幕上时,该状态变为 true。

这是一个使用 React Native 核心的 Pressable 和 Touchable 组件的示例,它们不接受/执行 onFocus 和 onBlur 属性:

ays Of Managing Focus In React Native

使用react-native-tvos中相同的Pressable和Touchable组件,它们接受并执行onFocus和onBlur道具:

ays Of Managing Focus In React Native

4. hasTVPreferredFocus 属性

一些 React Native 组件具有 hasTVPreferredFocus 属性,它可以帮助您确定焦点的优先级。如果设置为 true,hasTVPreferredFocus 将强制将焦点转移到该元素。根据 React Native 文档,这些是当前接受 prop 的组件:

ays Of Managing Focus In React Native

但是,如果您使用的是react-native-tvOS,则还有更多组件接受此属性:











让我们看一个例子:

  • 将 Pressable 2 的 hasTVPreferredFocus 属性设置为 true 会导致焦点位于 Pressable 2 上
  • 当我们位于 Pressable 3 时将其更改为 true 会导致焦点移动到 Pressable 3

ays Of Managing Focus In React Native

5. nextFocusDirection 属性

nextFocusDirection 属性指定当用户沿指定方向导航时接收焦点的下一个组件,帮助您处理焦点导航。当使用react-native-tvos时,该属性被接受hasTVPreferredFocus属性的相同组件接受(View、TouchableHighlight、Pressable、TouchableOpacity、TextInput、TVFocusGuideView、TouchableNativeFeedback、Button)。让我们看一个例子:

nextFocusDown={pressableRef3.current}
nextFocusRight={pressableRef5.current}>
  • 将 nextFocusDown 属性设置为 Pressable 3 会导致焦点向下移动时焦点移动到 Pressable 3
  • 将 nextFocusRight 属性设置为 Pressable 5 会导致焦点向右移动时焦点移动到 Pressable 5

ays Of Managing Focus In React Native

结论

在处理焦点管理时,React Native TV 应用程序没有一刀切的解决方案。该方法最终取决于项目的具体需求和要求。虽然react-native-tvos提供了有用的跨设备抽象,但您可能必须采用特定于平台的解决方案来处理跨SmartTV平台的常见碎片问题。

花时间探索这些不同的焦点管理解决方案,以便您可以为用户提供直观的焦点处理体验,无论他们使用什么 SmartTV 平台。

相关资源

  • https://dev.to/amazonappdev/tv-navigation-in-react-native-a-guide-to-using-tvfocusguideview-302i
  • https://medium.com/xite-engineering/revolutionizing-focus-management-in-tv-applications-with-react-native-10ba69bd90
  • https://reactnative.dev/docs/0.72/building-for-tv
版本声明 本文转载于:https://dev.to/amazonappdev/5-ways-of-managing-focus-in-react-native-3kfd?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-05-09
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-05-09
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-05-09
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-05-09
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-05-09
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-05-09
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-05-09
  • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    编程 发布于2025-05-09
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-05-09
  • 用户本地时间格式及时区偏移显示指南
    用户本地时间格式及时区偏移显示指南
    在用户的语言环境格式中显示日期/时间,并使用时间偏移在向最终用户展示日期和时间时,以其localzone and格式显示它们至关重要。这确保了不同地理位置的清晰度和无缝用户体验。以下是使用JavaScript实现此目的的方法。方法:推荐方法是处理客户端的Javascript中的日期/时间格式化和时...
    编程 发布于2025-05-09
  • Python环境变量的访问与管理方法
    Python环境变量的访问与管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    编程 发布于2025-05-09
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-05-09
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案:的,请访问量很大,并应为procectiquiestate的,并在整个代码上正确格式不多: java.text.simpledateformat; 导入java.util.calendar; 导入java...
    编程 发布于2025-05-09
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-05-09
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-05-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3