React Native屏幕适配工具封装(react native desktop)

React Native屏幕适配工具封装(react native desktop)

编码文章call10242025-08-05 14:17:191A+A-

由于项目中有一个问题没有解决,那就是不同手机屏幕的尺寸是不一样的,这尺寸是一个大问题,越到最后需要修改的尺寸越多,所以今天我抽空研究了一下,首先回忆,android的屏幕尺寸是根据不同手机的values里面的值来进行适配的,但是RN是作桥接到android的,所以在andoid values文件夹中获取尺寸数据是有点困难,然后就开始百度搜索,百度给出的答案是,主要看公式:

设计稿元素宽度(px) / 设计稿总宽度(px) = 元素的宽度(dp) / 屏幕的总宽度(dp)

公式先在上面放着,等会解释,先来解释RN设计稿单位与RN单位,设计稿的单位是px,rn的单位是dp,代码中输入的纯阿拉伯数字就是px也就是设计稿,rn就是通过自身的java或者ObjectC语言算出来的单位dp,因为设计稿元素宽度、设计稿总宽度,屏幕总宽度已知,要求的是元素的宽度,所以:

元素的宽度(dp)= 设计稿元素宽度(px)* 屏幕的总宽度(dp) / 设计稿总宽度(px)

以上算法是不同屏幕之间的尺寸适配,但有时,我们的ui设计师给我们的图片大小是px的,或者是dp的,这时候就需要用到rn官方给出的api:

export const px2dp = px => PixelRatio.roundToNearestPixel(px);
export const dp2px = dp => PixelRatio.getPixelSizeForLayoutSize(dp);

上面两种尺寸适配我封装了一个工具类,代码如下:

import {Dimensions, PixelRatio} from 'react-native';
const designWidth = 750;
const designHeight = 1334;
export const width = Dimensions.get('window').width;
export const height = Dimensions.get('window').height;
export const p2dWidth = px => {
  return px * (width / designWidth);
};
export const p2dHeight = px => {
  return px * (height / designHeight);
};
export const px2dp = px => PixelRatio.roundToNearestPixel(px);
export const dp2px = dp => PixelRatio.getPixelSizeForLayoutSize(dp);

需要注意的似:rn中获取的屏幕宽度或者高度是dp,如代码:

export const width = Dimensions.get('window').width;

上面获取到屏幕尺寸就不需要再继续转dp了,因为自身就是dp单位。

完整代码:

/**
 * React Native 适配工具类
 * 以iPhone6为基准
 */

import {
    Dimensions,
    PixelRatio,
  } from 'react-native';
  
  // iPhone6 尺寸
  const defaultDevice = {
    width: 375,
    height: 667
  }
  
  // 设备的宽
  const {
    width: deviceWidth
  } = Dimensions.get('window');
  
  // 字体大小缩放比例(Android下可设置字体大小)
  let fontScale = PixelRatio.getFontScale();
  
  // 获取缩放比例
  const scale = deviceWidth / defaultDevice.width;
  
  /**
   * 设置text
   * 如Android设备下不需要根据系统设置做字体缩放,可全面使用ScaleSize
   * @param {number} size
   * @returns {number}
   */
  export const ScaleText = size => {
    size = Math.round(size * scale * fontScale);
    return size;
  }
  
  /**
   * 设置size
   * @param {number} size
   * @returns {number}
   */
  export const ScaleSize = size => {
    size = Math.round(size * scale);
    return size;
  }

使用

const styles = StyleSheet.create({
content: {
width: ScaleSize(100),
fontSize: ScaleText(18)
}
})
点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4