ReactNative 响应式单位 rpx

日前在 ReactNative 开发中有遇到如何写出符合多种 viewport 宽度的样式的问题。在常规的移动端开发中,可以借助 remvw 等单位,那么在使用 ReactNative 时有没有类似的方案呢?最近进行小程序开发时注意到它们有 rpx 这种单位:

rpx(responsive pixel): 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。

受其启发,决定在代码中实现类似的单位,当需要自适应的时候写字符串 '20rpx',不需要的时候正常写数字 20

// style-sheet.js
import { StyleSheet, PixelRatio } from 'react-native';

const REG = /[\d\.]rpx/;

function pre(obj) {
  Object.keys(obj).forEach(key => {
    const value = obj[key];
    if (typeof value === 'object') {
      obj[key] = pre(value);
    } else if (typeof value === 'string' && REG.test(value)) {
      obj[key] = PixelRatio.getPixelSizeForLayoutSize(parseFloat(value) / 4);
    }
  });

  return obj;
}

function create(obj) {
  obj = pre(obj);
  return StyleSheet.create(obj);
}

const BORDER_COLOR = '#e6e6e6';

const SS = {
  hairlineWidth: StyleSheet.hairlineWidth,
  create,
  pre,
  absoluteFillObject: StyleSheet.absoluteFillObject,
  common: {
    backgroundColor: '#F2F3F8',
    center: {
      justifyContent: 'center',
      alignItems: 'center',
      display: 'flex'
    },
    centerH: {
      alignItems: 'center',
      display: 'flex',
      flexDirection: 'row'
    },
    centerV: {
      alignItems: 'center',
      display: 'flex',
      flexDirection: 'column'
    },
    primaryGreen: '#75CA2A',
    primaryDarkGreen: '#62A427',
    borderColor: BORDER_COLOR,
  }
}

export default SS;