元素

Image

<Image> 显示来自应用资源或 URL 的图片。图片在主线程之外下载和解码,按视图显示的尺寸降采样,并缓存在内存中。动态 GIF、WebP 和 APNG 图片会自动播放。

import { View } from "nsh";
import { Image } from "nsh/image";
import logo from "./assets/logo.png";

<View style={{ flexDirection: "row", gap: 12 }}>
  <Image src={logo} />
  <Image
    src="https://example.com/avatar.jpg"
    defaultSource={logo}
    resizeMode="cover"
    style={{ width: 64, height: 64, borderRadius: 32 }}
  />
</View>;

导入的资源知道自己的尺寸:不设 width 和 height 时图片使用该尺寸;只设其中一个时,另一个按资源的宽高比计算。URL 在加载完成前没有已知尺寸,所以要给远程图片设置 width 和 height(或者其中一个加上 aspectRatio)。

#图片来源

src(以及 defaultSource)接受:

值示例说明
导入的资源import logo from "./logo.png"一个 ImageAsset { uri, width, height },以点为单位:@2x 文件按像素的一半计算。可以导入 .png、.jpg、.jpeg、.gif、.webp 和 .heic。
URL"https://example.com/a.jpg"下载并缓存。同一 URL 的下载在多个视图之间共享。
资源路径"asset:/images/a.png"应用资源中的文件。
{ uri }{ uri: "https://…" }与字符串形式相同。

开发期间资源由开发服务器提供;nsh build 和 nsh package 会把它们拷贝进应用。参见图片与资源。

#属性

除通用属性外(style 的类型为 ImageStyle):

属性类型默认值说明
srcstring | ImageAsset | { uri: string }图片。
resizeMode"cover" | "contain" | "stretch" | "center""cover"图片如何适配其盒子。
defaultSourcestring | ImageAsset | { uri: string }src 加载完成前显示的图片;最好是本地资源。
blurRadiusnumber以该半径(点)模糊图片(在解码时于主线程外处理一次)。
fadeDurationnumberiOS 0,Android 300图片加载完成后淡入的时长,单位毫秒。
onLoadStart() => void开始加载。
onProgress(e: { loaded: number; total: number }) => void以字节计的下载进度(未知时 total 为 0),最多每 100 ms 一次。
onLoad(e: { width: number; height: number }) => void加载完成;给出源图片的像素尺寸(不是解码、降采样后的尺寸)。
onError(e: { message: string }) => void加载失败。
onLoadEnd() => void在 onLoad 或 onError 之后。

ImageStyle 在视图样式之上增加了 tintColor:为模板图片(单色绘制的图标)重新着色。

<Image src={icon} style={{ width: 24, height: 24, tintColor: "#0969da" }} />

#事件

事件载荷触发时机
onLoadStart无开始加载。
onProgress{ loaded, total }收到数据(最多每 100 ms 一次)。
onLoad{ width, height }图片已显示;给出源图片的像素尺寸。
onError{ message }加载或解码失败,或主机不被允许。
onLoadEnd无在 onLoad 或 onError 之后。
const state = signal("加载中");
<Image
  src={url}
  style={{ width: "100%", aspectRatio: 16 / 9 }}
  onLoad={(e) => state.set(`${e.width}×${e.height} px`)}
  onError={(e) => state.set(e.message)}
/>;

如果需要在显示前获取图片尺寸或预先加载,请调用 Image.getSize(uri) 和 Image.prefetch(uri):它们就挂在渲染这个元素的、来自 nsh/image 的同一个 Image 上。

#ref 方法

没有自己的方法。

#平台说明

  • 缓存键包含解码尺寸和模糊半径:同一 URL 以两种尺寸显示会解码两次,但只下载一次。
  • iOS 以关键帧动画播放动态图片(最多 600 帧);着色的动态图片只显示第一帧。
  • Android 从 API 28 起播放动态图片(AnimatedImageDrawable);在 Android 上动态图片不缓存,也不会被模糊。
  • 在 Android 上边框绘制在图片之上,与 iOS 一致。