关于密度无关像素
dp是一种逻辑用户界面单位。Vega使用显示屏比例系数,将其映射为物理像素:width: 100绘制为100物理像素。迁移后,相同的值表示100 dp。比例系数为2或2.66时,Vega分别绘制200物理像素和266物理像素。这是需要评估的主要布局影响。
Vega画布的参考尺寸为960×540dp,在1080p显示屏上的比例系数为2。
涉及单位更改的内容
RN 0.83会将dp映射应用于整个用户界面路径:- Vega会缩放最终绘制画布及损坏区域。
- 窗口大小和位置在图形边界处以物理像素为单位,但在应用代码中仍以dp为单位。
- 指针、触摸、大小调整、窗口位置和遮蔽事件在返回React Native时均以dp为单位。
- 子窗口、弹出窗口、模态、纹理缓存层和虚拟表面均使用相同比例。
Dimensions和useWindowDimensions()会报告逻辑尺寸。PixelRatio.get()会报告物理像素与dp的比率。
未涉及单位更改的内容
以下两项保留原有行为:- 位图数据。dp渲染不会缩放位图数据,也不会更改图像元数据。图像解码器、位图、像素图和纹理仍使用物理像素尺寸。
- 字体缩放。dp渲染不会替代无障碍字体缩放。继续使用React Native文本API和
fontScale,以适配用户选择的文本大小。
PixelRatio和DeviceInfo TurboModule
PixelRatio是一种React Native JavaScript实用工具,而非独立的TurboModule。PixelRatio.get()会读取Dimensions.get('window').scale。原生DeviceInfo TurboModule会向Dimensions提供width、height、scale和fontScale。
在RN 0.83中,DeviceInfo会报告逻辑窗口尺寸以及当前的物理像素与dp之间的比例。还会通过didUpdateDimensions发布每个表面的尺寸更新数据。
Vega使用密度无关像素的原因
Android和iOS上的React Native均默认使用逻辑单位。Vega会对所有RN 0.83应用采用相同的默认坐标模型,因此三个目标上的几何行为是一致的。 现在采用的统一单位合约涵盖了标准React Native组件、自定义原生组件、TurboModules、第三方库、窗口API、渲染及输入事件。应用会以逻辑单位描述用户界面几何,而Vega会在图形边界处进行换算。用户界面比例在不同画布分辨率的设备上保持一致,而可缩放用户界面可以选择分辨率更高的画布,无需单独进行像素布局。应用中的更改
下表将RN 0.72的常见模式映射到RN 0.83的对应行为。转换像素调优后的值
RN 0.83中的数值型长度值均以dp为单位。使用迁移前基线的比例系数,对“调优”值进行物理像素转换:替换固定屏幕尺寸
经过硬编码的屏幕常量不再匹配逻辑视口。改为在运行时读取尺寸。useWindowDimensions()会返回逻辑尺寸。分配React Native样式前,请勿将其转换为物理像素。
使用逻辑输入坐标
RN 0.83以dp为单位,报告指针和触摸坐标:以dp为单位保留自定义原生接口
在React Native边界处,以dp为单位定义自定义组件和TurboModule几何值。widthDp和targetWidthPx。
处理图像
图像布局和图像数据使用不同的单位:<Image style={{width, height}}>以dp为单位。- 源位图尺寸、解码后的图像尺寸、行字节和纹理尺寸则以物理像素为单位。
- React Native提供首选逻辑解码尺寸时,Vega图像管道会在解码前将该尺寸乘以当前比例系数。请勿在您自己的代码中对
<Image>样式或首选布局尺寸进行乘法运算。 - 源图需要足以匹配其渲染dp尺寸的物理像素。以比例系数2、尺寸320x180 dp进行图像渲染时,源图像素至少要达到640×360,才能避免放大。
本地资产
在同一目录中提供多种密度变体。Metro和React Native会根据当前密度选择匹配的资产。@3x数据。React Native会选择分辨率更高的资产,避免放大低分辨率的源图。对于图标等非摄影类图形,建议优先使用SVG。
迁移核对清单
要完成dp迁移,请完成以下步骤:- 将应用升级到RN 0.83,并移除所有与新默认行为重复的RN 0.72 dp实验标记。
- 清查应用中的数值型长度值、固定画布常量(如
1920和1080)以及所有坐标转换辅助工具。 - 使用
logicalValue = legacyPixelValue ÷ baselineScaleFactor转换以物理像素为单位调优的值,密度无关UX规范中原有的值则保持不变。 - RN 0.83报告的指针、手势、滚动、大小调整和窗口坐标均以dp为单位。
- 更改React Native与原生层之间的自定义几何值契约,使其以dp为单位,且仅在明确要求以物理像素为单位的API处,保留像素转换。
- 以Flexbox、百分比、
Dimensions或useWindowDimensions()替换经过硬编码的屏幕尺寸。 - 添加本地位图密度变体,并确认每张图片的物理像素足以匹配其渲染逻辑尺寸。
- 测试每种支持密度下的主窗口、模态、弹出窗口、警报、子窗口、滚动、手势、焦点、无障碍功能、本地化以及从右到左的布局。

