React Native 设备屏幕尺寸适配:react-native-size-matters

在 web 开发中,我们会使用 px2rem 或者 pxtoviewport 来做不同尺寸屏幕的适配

在 react native 中,可以使用 react-native-size-matters

安装依赖:

bash 复制代码
yarn add react-native-size-matters

默认使用的换算尺寸为 350dp x 680dp,我们可以通过配置改变换算的尺寸,假设 UI 设计稿尺寸为 390

在根目录创建.env 文件

ini 复制代码
SIZE_MATTERS_BASE_WIDTH=390
SIZE_MATTERS_BASE_HEIGHT=844

为了能够读取.env的配置,需要安装 babel-plugin-dotenv-import

安装依赖:

bash 复制代码
yarn add -D babel-plugin-dotenv-import

修改 babel.config.js,在 plugins 里添加 dotenv-import 配置

js 复制代码
module.exports = {
  presets: ['module:@react-native/babel-preset'],
  plugins: [
    [
      'module-resolver',
      {
        root: ['./src'],
        alias: {
          '@': './src',
        },
      },
    ],
    'react-native-reanimated/plugin',
    [
      'dotenv-import',
      {
        moduleName: '@env',
        path: '.env',
      },
    ],
  ],
};

创建全局类型目录 types,创建一个 env.d.ts,后续新增了环境变量方便使用类型提示

ts 复制代码
declare module '@env' {
  export const SIZE_MATTERS_BASE_WIDTH: number;
  export const SIZE_MATTERS_BASE_HEIGHT: number;
}

尝试在页面输出一下环境变量,读取到就 ok 了

tsx 复制代码
import {SIZE_MATTERS_BASE_WIDTH, SIZE_MATTERS_BASE_HEIGHT} from '@env';

...
<Text> SIZE_MATTERS_BASE_WIDTH: {SIZE_MATTERS_BASE_WIDTH} </Text>
<Text> SIZE_MATTERS_BASE_HEIGHT: {SIZE_MATTERS_BASE_HEIGHT} </Text>
...

使用了自定义尺寸后,需要从 react-native-size-matters/extend 引入方法

ts 复制代码
import {ScaledSheet} from 'react-native-size-matters/extend';

在我们上一篇React Native 路由导航:React Navigation 的代码基础上完善

修改首页使用示例:

tsx 复制代码
import {HomeScreenProps} from '@/navigation/types';
import {Button, Text, View} from 'react-native';
import {SafeAreaView} from 'react-native-safe-area-context';
import {API_URL} from '@env';
import {scale, ScaledSheet} from 'react-native-size-matters/extend';

const HomeScreen = ({navigation}: HomeScreenProps) => {
  return (
    <SafeAreaView style={styles.container} edges={['top']}>
      <View style={styles.content}>
        <Text style={{fontSize: scale(16)}}> HomeScreen {API_URL} </Text>
        <Button
          title="open main drawer"
          onPress={() => {
            navigation.openDrawer();
          }}
        />

        <Button
          title="open AboutScreen"
          onPress={() => {
            navigation.navigate('About');
          }}
        />

        <Button
          title="open one press login modal"
          onPress={() => {
            navigation.navigate('OnePressLoginModal');
          }}
        />
      </View>
    </SafeAreaView>
  );
};

const styles = ScaledSheet.create({
  container: {
    backgroundColor: 'red',
  },
  content: {
    backgroundColor: '#fff',
    fontSize: '20@s',
  },
});

export default HomeScreen;

参考文档

github.com/nirsky/reac...

Tips

本专栏的代码已开源,后续随着专栏会不断更新https://github.com/ace0109/react-native-template

相关推荐
前端程序猿i8 小时前
彻底搞懂防抖(Debounce)与节流(Throttle):源码实现与应用场景
开发语言·前端·javascript·vue.js·ecmascript
Nicholas689 小时前
Dart锁机制之synchronized源码解析Lock、BasicLock、objectMakeLock、objectSynchronized(一)
前端
小帆聊前端9 小时前
深度解读虚拟列表:从原理到实战,解决长列表渲染性能难题
前端·javascript
在下历飞雨9 小时前
Kuikly基础之动画实战:让孤寡青蛙“活”过来
前端·ios·harmonyos
2***c4359 小时前
nginx服务器实现上传文件功能_使用nginx-upload-module模块
服务器·前端·nginx
p***93039 小时前
Java进阶之泛型
android·前端·后端
木易 士心9 小时前
Element UI 多级菜单缩进的动态控制:从原理到工程化实践
前端·vue.js·ui
狮子座的男孩9 小时前
js函数高级:03、详解原型与原型链(原型、显式原型与隐式原型、原型链、原型链属性、探索instanceof、案例图解)及相关面试题
前端·javascript·经验分享·显示原型与隐式原型·原型链及属性·探索instanceof·原型与原型链图解
烛阴9 小时前
C#继承与多态全解析,让你的对象“活”起来
前端·c#
狗哥哥9 小时前
Swagger对接MCP服务:赋能AI编码的高效落地指南
前端·后端