react-native-photo-view:基于 React Native 鸿蒙生态的图片缩放查看组件

支持双指缩放的图片查看组件

Branch3Tags3
FilesLast commitLast update
19 days ago
19 days ago
19 days ago
1 month ago
1 month ago
19 days ago
19 days ago
19 days ago
1 month ago
19 days ago
1 month ago

react-native-photo-view

本项目基于 react-native-photo-view开发。如果在使用过程中有任何问题,欢迎在AtomGit提交Issue,会及时跟进。

项目介绍

@hxa-rn/react-native-photo-view 是 react-native-photo-view@1.5.3 的 HarmonyOS 适配包。它提供 Fabric 组件 PhotoView,用于加载远程或本地图片,并支持双指捏合缩放、双击缩放、图片平移、缩放类型和加载/手势事件。

鸿蒙端含 ArkTS Fabric 组件与 C++/ETS 自动链接产物。远程 http(s) 图片会先下载再解码渲染。

集成指南

npm install @hxa-rn/react-native-photo-view

包已声明 harmony.alias 为 react-native-photo-view。在 HarmonyOS 工程中配置 Metro / RNOH alias 后,业务代码仍从原包名导入:

import PhotoView from 'react-native-photo-view';

peerDependencies:react-native >= 0.72。

组件为 Fabric 原生组件,使用 RNOH 自动链接即可;不需要手动注册 TurboModule,也不需要手动链接 HAR。

使用说明

import React, {Component} from 'react';
import {StyleSheet, View} from 'react-native';
import PhotoView from 'react-native-photo-view';

export default class PhotoExample extends Component {
  _onScale = (event: {nativeEvent: unknown}) => {
    console.log('_onScale', event.nativeEvent);
  };
  _onTap = (event: {nativeEvent: unknown}) => {
    console.log('_onTap', event.nativeEvent);
  };
  _onViewTap = (event: {nativeEvent: unknown}) => {
    console.log('_onViewTap', event.nativeEvent);
  };
  _onLoadStart = (event: {nativeEvent: unknown}) => {
    console.log('_onLoadStart', event.nativeEvent);
  };
  _onLoad = (event: {nativeEvent: unknown}) => {
    console.log('_onLoad', event.nativeEvent);
  };
  _onLoadEnd = (event: {nativeEvent: unknown}) => {
    console.log('_onLoadEnd', event.nativeEvent);
  };

  render() {
    return (
      <View style={styles.container}>
        <PhotoView
          source={{uri: 'https://picsum.photos/id/237/800/600'}}
          onScale={this._onScale}
          onTap={this._onTap}
          onViewTap={this._onViewTap}
          onLoadStart={this._onLoadStart}
          onLoad={this._onLoad}
          onLoadEnd={this._onLoadEnd}
          showsVerticalScrollIndicator={true}
          showsHorizontalScrollIndicator={true}
          minimumZoomScale={0.5}
          maximumZoomScale={3}
          androidScaleType="center"
          style={styles.photo}
        />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  photo: {
    width: 300,
    height: 300,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: 'black',
  },
});

本地资源可作为 source 传入,例如 source={require('./assets/photo.png')}。加载期间传入 loadingIndicatorSource 可显示占位图。

接口文档

以下为公开 Props / Events 签名摘要,不是可执行代码。

Props

属性 类型 说明
source {uri?: string, headers?: Record<string, string>} | number 远程 URL、本地 URI 或 require 资源
loadingIndicatorSource {uri?: string} | number 加载期间显示的占位图
fadeDuration number 图片淡入时长,单位 ms
minimumZoomScale / maximumZoomScale number 缩放边界,默认 1 / 3
scale number | null 程序化设置缩放比例
androidScaleType center、centerCrop、centerInside、fitCenter、fitStart、fitEnd、fitXY、matrix 图片缩放显示方式
androidZoomTransitionDuration number 双击缩放和回弹过渡时长,单位 ms
showsHorizontalScrollIndicator / showsVerticalScrollIndicator boolean iOS 专有。鸿蒙 不支持(签名保留,空实现,不绘制系统滚动条)。详见不支持报告 U-01 / U-02

Events

事件 载荷
onLoadStart / onLoadEnd {}
onLoad {width, height}
onError {error}
onProgress {loaded, total}
onTap {x, y, scale}
onViewTap {x, y}
onScale {scale, scaleFactor, focusX, focusY}

快速验证(运行 Example)

前置条件

依赖 版本要求
Node.js >= 18
DevEco Studio 5.0+ / 6.0+
HarmonyOS SDK API 12+

运行步骤

1. 克隆仓库

git clone https://gitcode.com/hxa-rn/react-native-photo-view.git
cd react-native-photo-view
git checkout main

2. 安装仓库开发依赖

npm install --legacy-peer-deps

Example 已改为从 npm 公仓安装 @hxa-rn/react-native-photo-view@1.5.6,不再使用本地 file:../xxx.tgz,运行 Example 不必再执行 npm pack。

3. 进入 example 目录,安装依赖

cd example
npm install --legacy-peer-deps

4. 生成 JS Bundle

npm run dev

产物:harmony/entry/src/main/resources/rawfile/bundle.harmony.js

5. 用 DevEco Studio 打开鸿蒙工程

  • 打开 DevEco Studio
  • 选择 example/harmony 目录
  • 等待 Sync 完成

6. 编译并运行 HAP

在 DevEco Studio 中点击运行按钮,将 HAP 安装到设备/模拟器。

注意:Example 中已预置插件依赖和 Package 注册,无需手动配置 Link。

约束与限制

项目 要求或限制
兼容性 HarmonyOS compatibleSdkVersion 为 5.0.1(13);React Native >=0.72,使用 RNOH 新架构
权限 库模块自身无额外系统权限。宿主应用加载远程图片时需自行声明 ohos.permission.INTERNET
matrix API 15+ 使用 ImageFit.MATRIX(原尺寸、左上对齐);API 低于 15 时降级为 center
fitStart / fitEnd 使用 Contain 配合 Stack 顶对齐 / 底对齐近似实现
onProgress 远程 http(s) 自下载路径上报 {loaded, total}
点击坐标 鸿蒙端 onTap / onViewTap 返回组件相对比例坐标 [0,1]
滚动指示器 showsHorizontalScrollIndicator / showsVerticalScrollIndicator 鸿蒙不支持。二者依赖 iOS UIScrollView 系统滚动条;鸿蒙 PhotoView 以 Stack + Image + 变换实现缩放平移,不是可滚动容器,调用时空实现,界面不出现系统滚动条

开源license

本项目基于 MIT 协议,详见 LICENSE 文件。

问题反馈渠道

欢迎在 AtomGit 提交 Issue。也可以通过 GitCode 仓库反馈:

https://gitcode.com/hxa-rn/react-native-photo-view

https://gitcode.com/hxa-rn/react-native-photo-view/issues

Introduction

支持双指缩放的图片查看组件

Customize your domain