4.3 屏幕尺寸适配

修改 src/pages/MyPage.js

export default class MyPage extends Component<Props> {

    render() {
        return ( // 渲染布局
            <View style={styles.container}>
                <View style={{height:50, width:375,backgroundColor:'red'}}/>
            </View>
        );
    }
}

上面代码只是定义了一个 View 高是50,width 是 375 ,RN 尺寸的单位是 PT,375其实就是 iPhone6/7/8 的屏幕宽度(屏幕宽度是750像素,375 PT)。

但是这段代码在 iPhone6 和 部分 Android 机型显示就有问题,如图4-9所示。

图4-9图4-9 iPhone 和 Android 运行的差异

一般效果图 iPhone6/7/8 的尺寸,我们希望 375长度 在任何机型上都能恰好占横屏的全部,需要引入工具类 px2dp

修改代码,/src/utils/px2dp.js

'use strict';
import {Dimensions} from 'react-native';

/**
 * 屏幕工具类
 * ui设计基准,iphone 6
 * width:750
 * height:1334
 */
export let screenW = Dimensions.get('window').width;
export let screenH = Dimensions.get('window').height;
const r2=2;
const w2 = 750/r2;
const h2 = 1334/r2;

export const DEFAULT_DENSITY=r2;

/**
 * 屏幕适配,缩放size
 * @param size
 * @returns {Number}
 * @constructor
 */
export default function px2dp(size) {
    let scaleWidth = screenW / w2;
    size = Math.round((size * scaleWidth + 0.5));
    return size/DEFAULT_DENSITY;
}

如果设计稿不是 iPhone6 的尺寸,则需要更改 r2,w2 和 h2 的值,r2 代表密度,iPhone6 上 1pt =2px。 w2 和 h2 分别用 iphone6 尺寸的宽度 750 像素和高度 1334 像素除以密度。

px2dp 方法接收效果图标注的像素,根据不同机型得到不同的尺寸。修改 MyPage.js :

import px2dp from "../utils/px2dp";

type Props = {};
export default class MyPage extends Component<Props> {

    render() {
        return ( // 渲染布局
            <View style={styles.container}>
                <View style={{height: px2dp(100), width: px2dp(750), backgroundColor: 'red'}}/>
            </View>
        );
    }
}

Android 上的运行结果和 iOS 基本保持一致了, 为了更好适配不同手机,建议单位采用 px2dp 这种方式。

字体适配

无论 Android 和 iOS ,用户都是可以通过手机系统设置调整手机字体的大小,这点需要格外注意,因为如果用户设置字体过大或者过小,会影响 Text 等组件显示的大小。一般某些特殊界面不允许按照系统设置的字体缩放比显示,这时候需要设置 Text 组件 allowFontScaling 属性为 false。我们抽取出一个组件 TextFix :

// /src/component/TextFix.js
import React from 'react';
import {Text} from 'react-native';


const TextFix=(props)=> {
    return (
        <Text {...props} allowFontScaling={false}>
            {props.children}
        </Text>
    );
};

export default TextFix;

查看代码

如果你已经从 GitHub 上克隆了这个程序的 Git 仓库,那么可以执行 git checkout 4b 签出程序的这个版本。

results matching ""

    No results matching ""