React Native中带Ref的View使用.measure,Android坐标始终为0(iOS正常)
React Native 中 View Ref 获取Y坐标 Android 始终返回0的解决办法
几个可行的排查和解决方向:
等组件完全渲染后再测量
Android 的视图布局是异步执行的,组件刚挂载就调用measure大概率还没完成布局计算。可以用InteractionManager延迟到交互完成后再执行测量,或者监听目标 View 的onLayout事件,在布局完成时获取坐标:import { InteractionManager } from 'react-native'; useEffect(() => { InteractionManager.runAfterInteractions(() => { viewRef.current?.measure((_, y) => { console.log('Y坐标:', y); }); }); }, []);或者用
onLayout:<View ref={viewRef} collapsable={false} onLayout={() => { viewRef.current?.measure((_, y) => { console.log('布局完成时的Y坐标:', y); }); }} > {/* 子内容 */} </View>换用
measureInWindow方法measure返回的是相对于父容器的坐标,有时候父容器布局异常会导致值不对。measureInWindow返回的是相对于屏幕的绝对坐标,试试这个方法:viewRef.current?.measureInWindow((_, y) => { console.log('屏幕绝对Y坐标:', y); });检查父组件的布局状态
如果目标 View 嵌套在ScrollView、FlatList这类滚动容器里,或者父组件有动态高度变化,要等滚动停止、父组件布局稳定后再测量。比如给ScrollView添加onScrollEndDrag监听,在滚动停止后执行测量。确认
collapsable={false}作用对象正确
确保这个属性直接加在你要测量的那个 View 上,不要加在父组件或者嵌套的其他 View 上,否则不会生效。
备选方案:用 UIManager 测量
如果上述方法都没效果,可以尝试直接调用原生的测量方法:
import { UIManager, findNodeHandle } from 'react-native'; const handle = findNodeHandle(viewRef.current); UIManager.measure(handle, (_, y) => { console.log('UIManager测量的Y坐标:', y); });
内容的提问来源于stack exchange,提问作者Jhnsbrst
相关产品推荐
相关产品推荐

