如何设计兼容所有设备的 React Native 屏幕
How to design screens in react native compatible for all devices
我正在尝试设计这个设计react-native
。这是我为此编写的代码,但这不是我想要的。这仅适用于一个屏幕,如果我更改屏幕尺寸则无法正常工作。
这看起来像绝对布局。我应该做哪些更改才能使其适用于所有屏幕尺寸。
/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/
import React, { Component } from "react";
import {
AppRegistry,
Image,
View,
Text,
Button,
StyleSheet
} from "react-native";
class SplashScreen extends Component {
render() {
console.disableYellowBox = true;
return (
<View style={styles.container}>
<Image
source={require("./img/talk_people.png")}
style={{ width: 300, height: 300 }}
/>
<Text style={{ fontSize: 22, textAlign: "center", marginTop: 30 }}>
Never forget to stay in touch with the people that matter to you.
</Text>
<View style={{ marginTop: 60, width: 240 }}>
<Button title="CONTINUE" color="#FE434C" />
</View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
backgroundColor: "#FFFFFF",
margin: 50,
alignItems: "center",
flex: 1,
flexDirection: "column"
}
});
AppRegistry.registerComponent("Scheduled", () => SplashScreen);
预期状态:
当前状态:
连结 4 - 768x1280
连结 6P - 1440x2560
快速的答案是在你的外部容器中使用 flex,这样你就可以说:
<View style={{flex: 1}}>
<View style={{flex: 2}}>
<.../>//Image
</View>
<View style={{flex: 1}}>
<.../>//Text
</View>
<View style={{flex: 1}}>
<.../>//Button
</View>
</View>
这会将容器分成四分之一,将屏幕的上半部分分配给图像,另外两部分分配给文本和按钮;您可以根据需要使用填充和边距,并使用您想要的任何比例。
不过,还需要考虑的是屏幕像素密度,它确实会对显示尺寸造成严重破坏。我发现有一个户外空间很方便
import React from 'react';
import { PixelRatio } from 'react-native';
let pixelRatio = PixelRatio.get();
export const normalize = (size) => {
switch (true){
case (pixelRatio < 1.4):
return size * 0.8;
break;
case (pixelRatio < 2.4):
return size * 1.15;
break;
case (pixelRatio < 3.4):
return size * 1.35;
break;
default:
return size * 1.5;
}
}
export const normalizeFont = (size) => {
if (pixelRatio < 1.4){
return Math.sqrt((height*height)+(width*width))*(size/175);
}
return Math.sqrt((height*height)+(width*width))*(size/100);
}
我用作
的模块
import { normalize, normalizeFont } from '../config/pixelRatio';
const {width, height} = require('Dimensions').get('window');
...对于图像,说:
<Image source={ require('../images/my_image.png') } style={ { width: normalize(height*.2), height: normalize(height*.2) } } />
和字体:
button_text: {
fontSize: normalizeFont(configs.LETTER_SIZE * .7),
color: '#ffffff'
},
希望对您有所帮助!
编辑:上面的模块适用于我部署到的设备,但应该扩展它以允许从 1 到 4 的 pixelRatio 值和一些小数(例如 1.5)值也在那里。有一个 good chart at this link 我正在努力尝试完成这个,但到目前为止效果最好的是我在上面发布的。
另一种创建动态布局的好方法是使用 Dimensions,我个人讨厌 flex(有时无法理解) 使用 Dimensions 你可以获得屏幕宽度和高度。之后你可以划分结果并将它们分配给顶级组件
import React, { Component } from "react";
import {
View,
StyleSheet,
Dimensions
} from "react-native";
const styles = StyleSheet.create({
container: {
backgroundColor: "#FFFFFF",
height: Dimensions.get('window').height,
width: Dimensions.get('window').width,
//height:Dimensions.get('window').height*0.5// 50% of the screen
margin: 50,
alignItems: "center",
flex: 1,
flexDirection: "column"
}
});
此外,还遇到了支持媒体查询的 library,如果您对 css 样式感到满意,请尝试一下
我正在尝试设计这个设计react-native
。这是我为此编写的代码,但这不是我想要的。这仅适用于一个屏幕,如果我更改屏幕尺寸则无法正常工作。
这看起来像绝对布局。我应该做哪些更改才能使其适用于所有屏幕尺寸。
/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/
import React, { Component } from "react";
import {
AppRegistry,
Image,
View,
Text,
Button,
StyleSheet
} from "react-native";
class SplashScreen extends Component {
render() {
console.disableYellowBox = true;
return (
<View style={styles.container}>
<Image
source={require("./img/talk_people.png")}
style={{ width: 300, height: 300 }}
/>
<Text style={{ fontSize: 22, textAlign: "center", marginTop: 30 }}>
Never forget to stay in touch with the people that matter to you.
</Text>
<View style={{ marginTop: 60, width: 240 }}>
<Button title="CONTINUE" color="#FE434C" />
</View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
backgroundColor: "#FFFFFF",
margin: 50,
alignItems: "center",
flex: 1,
flexDirection: "column"
}
});
AppRegistry.registerComponent("Scheduled", () => SplashScreen);
预期状态:
当前状态:
连结 4 - 768x1280
连结 6P - 1440x2560
快速的答案是在你的外部容器中使用 flex,这样你就可以说:
<View style={{flex: 1}}>
<View style={{flex: 2}}>
<.../>//Image
</View>
<View style={{flex: 1}}>
<.../>//Text
</View>
<View style={{flex: 1}}>
<.../>//Button
</View>
</View>
这会将容器分成四分之一,将屏幕的上半部分分配给图像,另外两部分分配给文本和按钮;您可以根据需要使用填充和边距,并使用您想要的任何比例。
不过,还需要考虑的是屏幕像素密度,它确实会对显示尺寸造成严重破坏。我发现有一个户外空间很方便
import React from 'react';
import { PixelRatio } from 'react-native';
let pixelRatio = PixelRatio.get();
export const normalize = (size) => {
switch (true){
case (pixelRatio < 1.4):
return size * 0.8;
break;
case (pixelRatio < 2.4):
return size * 1.15;
break;
case (pixelRatio < 3.4):
return size * 1.35;
break;
default:
return size * 1.5;
}
}
export const normalizeFont = (size) => {
if (pixelRatio < 1.4){
return Math.sqrt((height*height)+(width*width))*(size/175);
}
return Math.sqrt((height*height)+(width*width))*(size/100);
}
我用作
的模块import { normalize, normalizeFont } from '../config/pixelRatio';
const {width, height} = require('Dimensions').get('window');
...对于图像,说:
<Image source={ require('../images/my_image.png') } style={ { width: normalize(height*.2), height: normalize(height*.2) } } />
和字体:
button_text: {
fontSize: normalizeFont(configs.LETTER_SIZE * .7),
color: '#ffffff'
},
希望对您有所帮助!
编辑:上面的模块适用于我部署到的设备,但应该扩展它以允许从 1 到 4 的 pixelRatio 值和一些小数(例如 1.5)值也在那里。有一个 good chart at this link 我正在努力尝试完成这个,但到目前为止效果最好的是我在上面发布的。
另一种创建动态布局的好方法是使用 Dimensions,我个人讨厌 flex(有时无法理解) 使用 Dimensions 你可以获得屏幕宽度和高度。之后你可以划分结果并将它们分配给顶级组件
import React, { Component } from "react";
import {
View,
StyleSheet,
Dimensions
} from "react-native";
const styles = StyleSheet.create({
container: {
backgroundColor: "#FFFFFF",
height: Dimensions.get('window').height,
width: Dimensions.get('window').width,
//height:Dimensions.get('window').height*0.5// 50% of the screen
margin: 50,
alignItems: "center",
flex: 1,
flexDirection: "column"
}
});
此外,还遇到了支持媒体查询的 library,如果您对 css 样式感到满意,请尝试一下