当前位置: 首页 > news >正文

【React Native】measureInWindow在安卓上无法正确获取View在屏幕上的布局信息

问题描述:
在React Native中,我们可以使用measureInWindow的方式去获取一个View在屏幕中的位置信息:
下面这个Demo中,我们写了一个页面HomePage和一个列表项组件ListItemA,我们期望每过5s监测一次列表中每一项在屏幕中的位置信息。
于是,我们使用useRef得到了一个ref对象,并且将ref指向ListItemA最外层的View。之后,我们每5s调用ref.current的measureInWindow方法以获取列表项在屏幕中的位置信息。
HomePage.tsx:

import React, { type FC, memo } from 'react';
import { StyleSheet, View } from 'react-native';
import { FlatList } from 'react-native-gesture-handler';import ListItemA from './ListItem';const styles = StyleSheet.create({container: {height: '100%',backgroundColor: 'red',alignItems: 'center',justifyContent: 'center',},text: {fontSize: 32,color: '#f55',},
});
const HomePage: FC<{}> = () => {const data = ['商品1', '商品2', '商品3', '商品4', '商品5'];return (<View style={styles.container}><FlatListstyle={{width: '100%',paddingHorizontal: 12,}}data={data}renderItem={({ item, index }) => {return <ListItemA index={index} title={item} />;}}/></View>);
};
export default memo(HomePage);

ListItemA.tsx:

import React, { useEffect, useRef } from 'react';
import { StyleSheet, Text, View } from 'react-native';interface IProps {index: number;title: string;
}
const styles = StyleSheet.create({container: {width: '100%',height: 40,borderRadius: 12,backgroundColor: '#ff00ff',marginTop: 12,flexDirection: 'column',justifyContent: 'center',},text: {fontSize: 14,color: '#000000',},
});
const ListItemA = (props: IProps) => {const ref = useRef<View>(null);useEffect(() => {// 每5s获取一次const timer = setInterval(() => {ref.current?.measureInWindow((x: number, y: number, width: number, height: number) => {console.log(props.index, '=>', x, y, width, height);});}, 5000);return () => {clearInterval(timer);};}, []);return (<Viewref={ref}style={{width: '100%',flexDirection: 'row',}}><View style={styles.container}><Text style={styles.text}>{`item${props.index}: ${props.title}`}</Text></View></View>);
};
export default ListItemA;

在Android手机上运行后,发现控制台log信息如下:
在这里插入图片描述

获取到的布局信息(屏幕中x坐标、屏幕中y坐标、View的宽度,View的高度)均为0。在我打开android的通知栏,再收起,打印信息甚至又发生了改变(这个数据如何得出暂时未知):
在这里插入图片描述
可以发现问题:

  1. 最开始无法获取到View的布局信息
  2. 会获取到未知错误信息(原因不详)
  3. 所有的列表项获取到的布局信息是一致的,每个列表项在屏幕中的坐标必然不同,此现象显然不符合预期

问题解决:
React Native针对android会有渲染优化,默认开启。
collapsable属性
在这里插入图片描述
我们ListItemA中的最外层View只是用来包裹了内层的View,没有其他的作用。即使在代码中移除了它,展示样式看起来也不会有变化。如果想要使用最外层View获取到布局信息,可以禁用优化,添加collapsable={false}以解决:
修改部分如下:

	<Viewref={ref}collapsable={false}style={{width: '100%',flexDirection: 'row',}}><View style={styles.container}><Text style={styles.text}>{`item${props.index}: ${props.title}`}</Text></View></View>

这时候再看打印,能够正确获取到每个列表item的布局信息了:
在这里插入图片描述

相关文章:

  • 【html】用html写一个博物馆首页
  • 想学接口测试,不知道那个工具适合?
  • 已解决ApplicationException异常的正确解决方法,亲测有效!!!
  • python单元测试
  • 视频AI分析定时任务思路解析
  • vscode用vue框架2,续写登陆页面逻辑,以及首页框架的搭建
  • 富文本编辑器CKEditor
  • Attention系列总结-粘贴自知乎
  • 【吊打面试官系列-Mysql面试题】视图有哪些优点?
  • Java爬虫(一)
  • OneNote for Windows 10 下载
  • input元素的oninput事件和onchange事件
  • RIP、OSPF、IS-IS学习
  • ViT:4 Pruning
  • 2024.06.22【读书笔记】丨生物信息学与功能基因组学(第十七章 人类基因组 第二部分)【AI测试版】
  • Cookie 在前端中的实践
  • ERLANG 网工修炼笔记 ---- UDP
  • iOS编译提示和导航提示
  • JavaScript函数式编程(一)
  • JSONP原理
  • Otto开发初探——微服务依赖管理新利器
  • Sequelize 中文文档 v4 - Getting started - 入门
  • session共享问题解决方案
  • use Google search engine
  • 从零开始学习部署
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 基于axios的vue插件,让http请求更简单
  • 类orAPI - 收藏集 - 掘金
  • 驱动程序原理
  • #{}和${}的区别是什么 -- java面试
  • $$$$GB2312-80区位编码表$$$$
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (笔试题)分解质因式
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (自用)仿写程序
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 中的轻量级线程安全
  • .NET微信公众号开发-2.0创建自定义菜单
  • [2024-06]-[大模型]-[Ollama] 0-相关命令
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [AIGC] 如何建立和优化你的工作流?
  • [Android] Implementation vs API dependency
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C#数据加密]——MD5、SHA、AES、RSA
  • [C++] 模拟实现list(二)
  • [CAN] 创建解析CAN报文DBC文件教程
  • [codevs] 1029 遍历问题