基于HarmonyOS API 24 React Native跨平台鸿蒙开发实战系列:Image标签图片自适应显示(一)
本文是基于HarmonyOS API 24的进行的React Native跨平台技术实战项目React Native 跨端鸿蒙开发行业简称 RNOHReact Native OpenHarmony是社区 华为共建的适配层方案把 Meta 的 React Native 框架完整移植到鸿蒙HarmonyOS NEXT / OpenHarmony让一套 React/JS/TS 代码同时运行在Android、iOS、鸿蒙手机 / 平板 / PC多端属于原生级跨端方案区别于 WebView 套壳网页方案。简单一句话前端工程师不用学 ArkTS用熟悉的 React 语法写业务底层自动映射成鸿蒙 ArkUI 原生控件打包成鸿蒙标准 hap 应用上架应用市场。它的核心定位可以概括为不改变 React/TypeScript 前端研发习惯复用现有 RN 业务代码资产依托鸿蒙系统底层接口做一层高性能中间适配层将 JSX 组件、JS 业务逻辑映射为鸿蒙原生 ArkUI 控件最终构建可在手机、平板、车机、智慧屏、PC 等全鸿蒙设备运行、支持上架华为应用市场的原生级应用。和 UniApp、WebView 套壳等网页类跨端方案有本质区别RNOH 不依赖浏览器内核渲染页面所有 UI 渲染、手势交互、视图层级全部交给鸿蒙系统原生图形引擎处理不存在网页性能瓶颈、样式兼容偏差等问题。兼容完整 React 生态、Hooks、JSX、RN 标准组件前端工程师无需学习 ArkTS、ArkUI 声明式语法仅需少量平台兼容代码即可完成多端适配底层打通鸿蒙 NAPI、ArkUI C 底层接口兼顾代码复用性与鸿蒙原生能力调用核心面向存量 RN App 快速新增鸿蒙渠道是前端团队切入鸿蒙生态最低成本的技术路线。因为编辑额器会自动识别通常我们只设置其中的一个另一个会按原来图的比例显示该图如果同时设置两个属性的话那图片的比例就会变形显示会片的与原来差别太的从而不美观。Web图片只设置宽度或高度时浏览器会根据图片的原始宽高比自动调整另一维度以保持比例不变。以下是具体原理和实现方式原理‌比例保持‌当只设置宽度或高度时浏览器会按原始比例计算另一维度。例如若图片原宽高比为4:3设置宽度为400px则高度自动调整为300px 。 ‌-‌ 避免变形‌同时设置宽高可能导致拉伸或压缩而单独设置可防止比例失真 。 ‌原理分析这种方式虽然编写起来快速而方便但在浏览器加载显示图片时可能会造成页面里的元素抖动或移位造成很差的用户体验。其原因是浏览器在遇到img标签时会根据img标签的src属性值向服务器请求读取图片在图片读取回来并显示之前浏览器会在图片所在位置放置一个空白的图片占位符。如果img标签指定了宽和高则图片占位符的尺寸等于所指定的宽和高但如果img标签没指定宽和高则图片占位符默认尺寸为32像素×32像素不同的浏览器图片占位符的默认大小不一样这时候如果图片周围有文字或其它内容当图片被浏览器从服务器上读取回来并显示的时候图片占位符就会被替换成图片占位符的尺寸也会重新被图片的实际尺寸所替换。造成的视觉效果是图片突然撑开了周围的文字或其它内容。这就是抖动和移位现象所以不推荐在编写img标签时缺省宽度和高度属性。造成扭曲或拉伸的根源在于图片的宽和高没有同比例缩放。好比孙悟空在变化成小鸟的时候如果头没有相应的变小那么就会有一个小鸟身、大鸟头。如果按等比缩放就不会扭曲或拉伸。所以如果指定图片列表中的图片为统一的尺寸则还需要对列表中的图片进行一定的编辑处理使源图片的实际尺寸与统一指定的尺寸相符或等比相符。比如图片的统一尺寸为400×300那么图片尺寸类似为800×600或1200×900就是等比相符。今天来实践一下图片自适应的功能在以前的开发中我们经常会对一些图片如果想要自适应的话可以定高、或者是定宽的形式来写但是在ReactNative鸿蒙开发中貌似不太行。importReactfromreact;import{View,Text,Dimensions,StyleSheet,Image}fromreact-native;//获取屏幕的宽高constscreenWidthMath.round(Dimensions.get(window).width);constscreenHightMath.round(Dimensions.get(window).height);constAppStylesStyleSheet.create({wrap:{width:100%,height:screenHight,backgroundColor:#85BDFF},title:{width:100%,height:72,fontFamily:OPPOSans, OPPOSans,fontWeight:normal,paddingTop:50,fontSize:36,color:#304057,lineHeight:72,textAlign:center,fontStyle:normal},banner:{paddingTop:50,paddingRight:32,paddingLeft:32,},bannerItem:{paddingTop:10,display:flex,flexDirection:row,alignItems:center,justifyContent:center,width:50%,}})functionApp(){return(View style{AppStyles.wrap}Text style{AppStyles.title}鸿蒙ReactNative系统/TextView style{AppStyles.banner}View style{{display:flex,flexDirection:row,justifyContent:space-between}}View style{AppStyles.bannerItem}Image style{{width:27,height:27}}source{require(./images/checked.png)}/ImageText style{{paddingLeft:4}}实时业绩便捷查询/Text/ViewView style{AppStyles.bannerItem}Image style{{width:27,height:27}}source{require(./images/checked.png)}/ImageText style{{paddingLeft:4}}订单状态轻松把控/Text/View/ViewView style{{display:flex,flexDirection:row,justifyContent:space-between}}View style{AppStyles.bannerItem}Image style{{width:27,height:27}}source{require(./images/checked.png)}/ImageText style{{paddingLeft:4}}宣传数据全程管理/Text/ViewView style{AppStyles.bannerItem}Image style{{width:27,height:27}}source{require(./images/checked.png)}/ImageText style{{paddingLeft:4}}海量素材一站转发/Text/View/View/ViewImage style{{width:289}}source{require(./images/login-bg.png)}/Image/View);}exportdefaultApp;可以看到这里的图片并没有显示说明并不能这种写法解决方案那么现在只能来写固定值的宽与高来显示这个图片尝试一下。安装DevEco Studio程序选择目标安装目录设置环境变量但是需要重启一下新建一个空白模板设置API为24的模板项目初始化项目自动下载相关依赖完整代码importReactfromreact;import{View,Text,Dimensions,StyleSheet,Image}fromreact-native;//获取屏幕的宽高constscreenWidthMath.round(Dimensions.get(window).width);constscreenHightMath.round(Dimensions.get(window).height);constAppStylesStyleSheet.create({wrap:{width:100%,height:screenHight,backgroundColor:#85BDFF},title:{width:100%,height:72,fontFamily:OPPOSans, OPPOSans,fontWeight:normal,paddingTop:50,fontSize:36,color:#304057,lineHeight:72,textAlign:center,fontStyle:normal},banner:{paddingTop:50,paddingRight:32,paddingLeft:32,},bannerItem:{paddingTop:10,display:flex,flexDirection:row,alignItems:center,justifyContent:center,width:50%,}})functionApp(){return(View style{AppStyles.wrap}Text style{AppStyles.title}鸿蒙ReactNative系统/TextView style{AppStyles.banner}View style{{display:flex,flexDirection:row,justifyContent:space-between}}View style{AppStyles.bannerItem}Image style{{width:27,height:27}}source{require(./images/checked.png)}/ImageText style{{paddingLeft:4}}实时业绩便捷查询/Text/ViewView style{AppStyles.bannerItem}Image style{{width:27,height:27}}source{require(./images/checked.png)}/ImageText style{{paddingLeft:4}}订单状态轻松把控/Text/View/ViewView style{{display:flex,flexDirection:row,justifyContent:space-between}}View style{AppStyles.bannerItem}Image style{{width:27,height:27}}source{require(./images/checked.png)}/ImageText style{{paddingLeft:4}}宣传数据全程管理/Text/ViewView style{AppStyles.bannerItem}Image style{{width:27,height:27}}source{require(./images/checked.png)}/ImageText style{{paddingLeft:4}}海量素材一站转发/Text/View/View/ViewImage style{{width:289,height:182}}source{require(./images/login-bg.png)}/Image/View);}exportdefaultApp;使用技巧无需指定图像的实际大小也就是说这两个值可以比实际的尺寸大一些或小一些。浏览器会自动调整图像使其适应这个预留空间的大小。使用这种方法就可以很容易地为大图像创建其缩略图或是放大很小的图像。但需要注意的是浏览器还是必须要下载整个文件不管它最终显示的尺寸到底是多大而且如果没有保持其原来的宽度和高度比例图像会发生扭曲。可以非常容易地实现对页面区域的填充同时还可以改善文档的性能。不需要创建一个具有完整尺寸的图像使用 height 和 width 属性把它扩展到更大的尺寸在文档中放置一个彩色的横条。

相关新闻

Kali Linux 2026虚拟机部署指南:从安装到汉化完整方案

Kali Linux 2026虚拟机部署指南:从安装到汉化完整方案

这次我们来看一个2026年最新版的Kali Linux完整部署方案。对于网络安全学习、渗透测试和系统安全评估来说,Kali Linux是绕不开的工具集。但很多新手卡在第一步:如何快速、稳定地完成从下载、安装到激活、汉化的全过程?这篇文章直接给你一套可…

2026/10/25 8:56:58 阅读更多 →
Flutter CI集成测试实战:解决flutter drive设备连接问题

Flutter CI集成测试实战:解决flutter drive设备连接问题

1. 项目概述:当自动化测试在CI上“失明” 在Flutter应用开发的后期,尤其是团队协作和持续交付的背景下,自动化集成测试( integration_test )是保障应用质量、防止回归问题的关键防线。 flutter drive 命令则是连接…

2026/10/25 8:55:47 阅读更多 →
AI知识库构建指南:从语义检索到智能知识管理实战

AI知识库构建指南:从语义检索到智能知识管理实战

1. 痛点切入:为什么需要AI知识库工具在日常开发和学习过程中,我们经常面临这样的困境:阅读技术书籍时做的笔记分散在多个平台,项目代码片段保存在本地文件,重要技术文档存储在云端,当需要快速查找某个解决方…

2026/10/24 17:11:46 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/25 11:19:54 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/24 17:47:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/24 18:34:36 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/25 10:02:42 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/25 3:12:30 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/24 21:09:59 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 10:02:43 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 7:47:32 阅读更多 →