ReactNative: 使用像素密度类PixelRatio进行适配
一、简介
现在设备显示屏的清晰度越来越高,尤其是iOS移动设备上的高清适配,Retina显示屏。在开发中,为了保证图片在不同的设备上显示的效果保持一致,往往需要准备多套图片,比如iOS开发中的@1x,@2x,@3x图,这是一件比较繁琐的事。在RN中,针对这个情况提供了一种新的解决方案,由于RN中的pt单位是统一的,所以通过像素密度来获取图片在不同设备上需要的真正大小。PixelRatio类提供的都是静态的方法,直接类名调用即可。PixelRatio类提供了一些默认的像素密度如下:
像素密度 适用设备PixelRatio.get() === 1 mdpi Android devices (160 dpi) PixelRatio.get() === 1.5 hdpi Android devices (240 dpi) PixelRatio.get() === 2 iPhone 4, 4S, 5, 5c, 5s, 6, xhdpi Android devices (320 dpi) PixelRatio.get() === 3 iPhone 6 plus、xxhdpi Android devices (480 dpi) PixelRatio.get() === 3.5 Nexus 6
二、API
//获取像素密度 static get(): number { return Dimensions.get(‘window‘).scale; } //获取字体比例,目前仅支持安卓,iOS默认还是使用像素密度 static getFontScale(): number { return Dimensions.get(‘window‘).fontScale || PixelRatio.get(); } //获取一个布局元素的真实像素大小,返回值是一个四舍五入的整型 static getPixelSizeForLayoutSize(layoutSize: number): number { return Math.round(layoutSize * PixelRatio.get()); } //将布局尺寸舍入到与整数像素数相对应的最接近的布局尺寸 //例如:on a device with a PixelRatioof 3,PixelRatio.roundToNearestPixel(8.4) = 8.33,exactly (8.33 * 3) = 25 pixels static roundToNearestPixel(layoutSize: number): number { var ratio = PixelRatio.get(); return Math.round(layoutSize * ratio) / ratio; } //仅支持web,开始检测 static startDetecting() {}
三、使用
/** * Sample React Native App * https://github.com/facebook/react-native * @flow */ import React, { Component } from ‘react‘; import { AppRegistry, StyleSheet, View, PixelRatio, Image } from ‘react-native‘; export default class ReactNativeDemo extends Component { render() { return ( <View style={styles.flex}> <View style={styles.view1}> <Image style={styles.image1} source={{uri:‘car1.png‘}}/> </View> <View style={styles.view2}> <Image style={styles.image2} source={{uri:‘car1.png‘}}/> </View> </View> ); } } const styles = StyleSheet.create({ flex: { flex: 1, alignItems: ‘center‘ }, view1: { marginTop: 50, width:200, height:200, borderColor:‘red‘, borderWidth: 5, ///未适配的线宽 borderRadius: 4, alignItems: ‘center‘, justifyContent: ‘center‘ }, view2: { marginTop: 30, width:200, height:200, borderColor:‘red‘, borderWidth: 5/PixelRatio.get(), ///适配后的线宽 borderRadius: 4, alignItems: ‘center‘, justifyContent: ‘center‘ }, image1: { width: 50, ///未适配的图宽(假设图片的原始宽度) height: 60 ///未适配的图高(假设图片的原始高度) }, image2: { width: PixelRatio.getPixelSizeForLayoutSize(50), ///适配后的图宽 height: PixelRatio.getPixelSizeForLayoutSize(60) ///适配后的图高 } }); AppRegistry.registerComponent(‘ReactNativeDemo‘, () => ReactNativeDemo);
可以发现:采用当前设备的像素密度适配后,边框线宽和图片的尺寸都变的精细了。
相关推荐
magic00 2020-01-29
Ifree团队 2019-12-10
绿豆饼 2019-12-11
芒果先生Mango 2015-03-10
whale 2019-06-30
zhouanzhuojinjie 2020-05-05
csdnuuu 2019-12-10
人走丿茶凉 2019-11-18
androidstudyroom 2019-11-08
翟浩浩Android 2019-10-28
屋顶小黑猫 2015-03-16
肥皂起司 2015-05-12
zjwijy 2011-12-29
Geeny 2019-06-28
yinbaoshiguang 2019-06-28
刘炳昭 2019-06-28
Android进阶 2019-06-28
蓝蓝的天 2019-06-28
learningITwell 2019-06-28