Answers:
从React Native 0.4.2开始,View组件具有onLayout
prop。传递一个接受事件对象的函数。该事件nativeEvent
包含视图的布局。
<View onLayout={(event) => {
var {x, y, width, height} = event.nativeEvent.layout;
}} />
onLayout
每当调整视图大小时,该处理程序也会被调用。
主要警告是,在onLayout
安装组件后一帧首先调用处理程序,因此您可能希望隐藏UI,直到计算出布局为止。
View
根据尺寸显示不同的内容。我不明白如何使用View的onLayout
功能来更改View的显示方式。这不是导致无限循环吗?
onLayout
是不相关的。
这是唯一对我有用的东西:
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
Image
} from 'react-native';
export default class Comp extends Component {
find_dimesions(layout){
const {x, y, width, height} = layout;
console.warn(x);
console.warn(y);
console.warn(width);
console.warn(height);
}
render() {
return (
<View onLayout={(event) => { this.find_dimesions(event.nativeEvent.layout) }} style={styles.container}>
<Text style={styles.welcome}>
Welcome to React Native!
</Text>
<Text style={styles.instructions}>
To get started, edit index.android.js
</Text>
<Text style={styles.instructions}>
Double tap R on your keyboard to reload,{'\n'}
Shake or press menu button for dev menu
</Text>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
});
AppRegistry.registerComponent('Comp', () => Comp);
基本上,如果您要设置尺寸并进行更改,则将其设置为如下所示的布局状态:
import React, { Component } from 'react';
import { AppRegistry, StyleSheet, View } from 'react-native';
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: 'yellow',
},
View1: {
flex: 2,
margin: 10,
backgroundColor: 'red',
elevation: 1,
},
View2: {
position: 'absolute',
backgroundColor: 'orange',
zIndex: 3,
elevation: 3,
},
View3: {
flex: 3,
backgroundColor: 'green',
elevation: 2,
},
Text: {
fontSize: 25,
margin: 20,
color: 'white',
},
});
class Example extends Component {
constructor(props) {
super(props);
this.state = {
view2LayoutProps: {
left: 0,
top: 0,
width: 50,
height: 50,
}
};
}
onLayout(event) {
const {x, y, height, width} = event.nativeEvent.layout;
const newHeight = this.state.view2LayoutProps.height + 1;
const newLayout = {
height: newHeight ,
width: width,
left: x,
top: y,
};
this.setState({ view2LayoutProps: newLayout });
}
render() {
return (
<View style={styles.container}>
<View style={styles.View1}>
<Text>{this.state.view2LayoutProps.height}</Text>
</View>
<View onLayout={(event) => this.onLayout(event)}
style={[styles.View2, this.state.view2LayoutProps]} />
<View style={styles.View3} />
</View>
);
}
}
AppRegistry.registerComponent(Example);
您可以通过在另一个具有“另一个”视图作为包装器的组件中使用它,并创建一个onResponderRelease回调,从而将触摸事件的位置传递到状态中,然后将其传递给子组件,从而创建更多的修改方式。作为属性,可以通过放置{[styles.View2, this.state.view2LayoutProps, this.props.touchEventTopLeft]}
等方式覆盖onLayout更新后的状态。
您可以直接使用该Dimensions
模块并计算视图大小。实际上,请Dimensions
提供主窗口的大小。
import { Dimensions } from 'Dimensions';
Dimensions.get('window').height;
Dimensions.get('window').width;
希望对您有所帮助!
更新:今天StyleSheet
在Flex中使用本机,可以在很大的情况下使用优雅的布局解决方案来编写清晰的代码,而不用计算视图大小...
尽管构建响应主窗口调整大小事件的自定义网格组件,可以在简单的窗口小部件组件中产生良好的解决方案
也许您可以使用measure
:
measureProgressBar() {
this.refs.welcome.measure(this.logProgressBarLayout);
},
logProgressBarLayout(ox, oy, width, height, px, py) {
console.log("ox: " + ox);
console.log("oy: " + oy);
console.log("width: " + width);
console.log("height: " + height);
console.log("px: " + px);
console.log("py: " + py);
}
NativeMethodsMixin
。无论我做什么,measure
始终是不确定的。有指针吗?
NativeMethodsMixin
仅在某些元素上可用的功能。例如,TouchableWithFeedback
确实具有测量功能,而常规则Touchable
没有。尝试更改View
您正在使用的类型,获取参考并检查measure元素是否可用。我也偶然发现了这一点。
对我来说,设置尺寸以使用%对我有用
width:'100%'
这是获取设备完整视图尺寸的代码。
var windowSize = Dimensions.get("window");
像这样使用它:
width=windowSize.width,heigth=windowSize.width/0.565