模板版本:v0.3.0
本项目基于 [email protected] 开发。
该第三方库的仓库已迁移至 Gitee,且支持直接从 npm 下载,新的包名为:@react-native-ohos/react-native-image-sequence
,具体版本所属关系如下:
Version | Package Name | Repository | Release |
---|---|---|---|
<= 0.9.1@deprecated | @react-native-oh-library/react-native-image-sequence | Github(deprecated) | Github Releases(deprecated) |
> 0.9.1 | @react-native-ohos/react-native-image-sequence | Gitee | Gitee Releases |
进入到工程目录并输入以下命令:
npm install @react-native-ohos/react-native-image-sequence-2
yarn add @react-native-ohos/react-native-image-sequence-2
下面的代码展示了这个库的基本使用场景:
[!WARNING] 使用时 import 的库名不变。
TestDemo.tsx
import React, { useState } from "react";
import { SafeAreaView, StyleSheet } from "react-native-harmony";
import { View, Text, Switch, TextInput, Button } from "react-native";
import TestDemo2 from "./TestDemo2";
const images = [
{ uri: "https://octodex.github.com/images/stormtroopocat.jpg" },
{ uri: 'https://octodex.github.com/images/saint_nictocat.jpg' },
require("./assets/2.jpg"),
require("./assets/3.jpg"),
require("./assets/4.jpg"),
require("./assets/5.jpg"),
require("./assets/6.jpg"),
];
export interface sequenceType {
images: NodeRequire[];
loop: boolean;
startFrameIndex: number;
framesPerSecond: number;
downsampleWidth: number;
downsampleHeight: number;
}
const ImageSequenceDemo = (props: any) => {
const [loopData, setLoopData] = useState(false);
const [isShow, setIsShow] = useState(false);
const [winWidth, setWinWidth] = useState(300);
const [winHeight, setWinHeight] = useState(200);
const [downsampleWidth, setDownSampleWidth] = useState(-1);
const [downsampleHeight, setDownSampleHeight] = useState(-1);
// 设置采样宽度
const inputSampleWidth = (value: string) => {
if (isNaN(Number(value))) {
return;
}
setDownSampleWidth(Number(value));
};
// 设置采样高度
const inputSampleHeight = (value: string) => {
if (isNaN(Number(value))) {
return;
}
setDownSampleHeight(Number(value));
};
// 设置起始位置
const [startFrameIndex, setFrameIndex] = useState(0);
const inputStartFrameIndex = (value: string) => {
if (isNaN(Number(value))) {
return;
}
let _value = Number(value);
if (Number(value) > images.length) {
_value = 0;
}
setFrameIndex(_value);
};
// 设置速率
const [framesPerSecond, setFramesPerSecond] = useState(24);
const inputFramesPerSecond = (value: string) => {
if (isNaN(Number(value))) {
return;
}
let _value = Number(value);
if (Number(value) <= 0) {
_value = 24;
}
setFramesPerSecond(_value);
};
const buttonIsShow = () => {
setIsShow(!isShow);
};
const inputSetWinWidth = (value: string) => {
if (isNaN(Number(value))) {
return;
}
setWinWidth(Number(value));
};
const inputSetWinHeight = (value: string) => {
if (isNaN(Number(value))) {
return;
}
setWinHeight(Number(value));
};
return (
<SafeAreaView>
<View>
<View>
<Text>
Current view size:width: {winWidth}, height:{winHeight}
</Text>
<Text>
开启循环:<Switch onValueChange={(value) => setLoopData(value)}></Switch>
</Text>
<View>
<Text>图片宽度/高度:</Text>
<View style={styles.box}>
<TextInput
style={[styles.input, styles.input1]}
onChangeText={(value) => inputSetWinWidth(value)}
defaultValue="300"
keyboardType="numeric"
/>
<TextInput
style={[styles.input, styles.input1]}
onChangeText={(value) => inputSetWinHeight(value)}
defaultValue="200"
keyboardType="numeric"
/>
</View>
</View>
<Text>开始位置:</Text>
<TextInput
style={styles.input}
onChangeText={(value) => inputStartFrameIndex(value)}
defaultValue="0"
keyboardType="numeric"
/>
<Text>播放速度:</Text>
<TextInput
style={styles.input}
onChangeText={(value) => inputFramesPerSecond(value)}
defaultValue="24"
keyboardType="numeric"
/>
<View>
<Text>采样宽度/高度:</Text>
<View style={styles.box}>
<TextInput style={[styles.input, styles.input1]} onChangeText={value => inputSampleWidth(value)} defaultValue='-1' keyboardType='default' />
<TextInput style={[styles.input, styles.input1]} onChangeText={value => inputSampleHeight(value)} defaultValue='-1' keyboardType='default' />
</View>
</View>
</View>
{!isShow ? (
<Button title="显示" onPress={() => buttonIsShow()} />
) : (
<Button title="返回" onPress={() => buttonIsShow()} />
)}
{isShow ? (
<TestDemo2
loop={loopData}
images={images}
width={winWidth}
height={winHeight}
startFrameIndex={startFrameIndex}
framesPerSecond={framesPerSecond}
downsampleWidth={downsampleWidth}
downsampleHeight={downsampleHeight}
/>
) : null}
</View>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
continer: {
flex: 1,
justifyContent: "center",
width: "100%",
height: "100%",
},
title: {
textAlign: "center",
marginVertical: 8,
},
fixToText: {
flexDirection: "row",
justifyContent: "space-between",
},
separator: {
marginVertical: 8,
borderBottomColor: "#737373",
borderBottomWidth: StyleSheet.hairlineWidth,
},
input: {
height: 40,
margin: 12,
borderWidth: 1,
borderColor: "red",
padding: 10,
width: 200,
},
box: {
flexDirection: "row",
justifyContent: "flex-start",
},
input1: {
width: 100,
},
});
export default ImageSequenceDemo;
TestDemo2.tsx
import { StyleSheet, View } from "react-native";
import ImageSequence from 'react-native-image-sequence-2'
const Separator = () => <View style={styles.separator}/>
const TestDemo2 = (props: any) => {
return (
<ImageSequence
images={props.images}
loop={props.loop}
startFrameIndex={props.startFrameIndex}
framesPerSecond={props.framesPerSecond}
downsampleWidth={props.downsampleWidth}
downsampleHeight={props.downsampleHeight}
style={{width: props.width, height: props.height}}
/>
)
}
const styles = StyleSheet.create({
separator: {
marginVertical: 8,
borderBottomColor: '#737373',
borderBottomWidth: StyleSheet.hairlineWidth
}
})
export default TestDemo2
此步骤为手动配置原生依赖项的指导。
首先需要使用 DevEco Studio 打开项目里的 HarmonyOS 工程 harmony
。
为了让工程依赖同一个版本的 RN SDK,需要在工程根目录的 harmony/oh-package.json5
添加 overrides 字段,指向工程需要使用的 RN SDK 版本。替换的版本既可以是一个具体的版本号,也可以是一个模糊版本,还可以是本地存在的 HAR 包或源码目录。
关于该字段的作用请阅读官方说明
{
"overrides": {
"@rnoh/react-native-openharmony": "^0.72.38" // ohpm 在线版本
// "@rnoh/react-native-openharmony" : "./react_native_openharmony.har" // 指向本地 har 包的路径
// "@rnoh/react-native-openharmony" : "./react_native_openharmony" // 指向源码路径
}
}
目前有两种方法:
- 通过 har 包引入(在 IDE 完善相关功能后该方法会被遗弃,目前首选此方法);
- 直接链接源码。
方法一:通过 har 包引入(推荐)
[!TIP] har 包位于三方库安装路径的
harmony
文件夹下。
打开 entry/oh-package.json5
,添加以下依赖
"dependencies": {
"@rnoh/react-native-openharmony": "file:../react_native_openharmony",
"@react-native-ohos/react-native-image-sequence-2":"file:../../node_modules/@react-native-ohos/react-native-image-sequence-2/harmony/image_sequence.har"
}
点击右上角的 sync
按钮
或者在终端执行:
cd entry
ohpm install
方法二:直接链接源码
[!TIP] 如需使用直接链接源码,请参考直接链接源码说明
[!TIP] 版本 0.9.2 及以上需要.
打开 entry/src/main/cpp/CMakeLists.txt
,添加:
+ set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
# RNOH_BEGIN: manual_package_linking_1
+ add_subdirectory("${OH_MODULES}/@react-native-ohos/react-native-image-sequence-2/src/main/cpp" ./image_sequence_2)
# RNOH_END: manual_package_linking_1
# RNOH_BEGIN: manual_package_linking_2
+ target_link_libraries(rnoh_app PUBLIC rnoh_image_sequence_2)
# RNOH_END: manual_package_linking_2
打开 entry/src/main/cpp/PackageProvider.cpp
,添加:
#include "RNOH/PackageProvider.h"
#include "generated/RNOHGeneratedPackage.h"
+ #include "ImageSequence2Package.h"
using namespace rnoh;
std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {
return {
std::make_shared<RNOHGeneratedPackage>(ctx),
+ std::make_shared<ImageSequence2Package>(ctx)
};
}
找到 function buildCustomRNComponent()
,一般位于 entry/src/main/ets/pages/index.ets
或 entry/src/main/ets/rn/LoadBundle.ets
,添加:
...
+ import { RNImageSequence } from "@react-native-ohos/react-native-image-sequence-2"
const arkTsComponentNames: Array<string> = ["SampleView",
"Generated",
"PropsDisplayer",
+ RNImageSequence.NAME
]
@Builder
export function buildCustomRNComponent(ctx: ComponentBuilderContext) {
...
+ if (ctx.componentName === RNImageSequence.NAME) {
+ RNImageSequence({
+ ctx: ctx.rnComponentContext,
+ tag: ctx.tag
+ })
+ }
...
}
...
打开 entry/src/main/ets/RNPackagesFactory.ts
,添加:
...
+ import { ImageSequencePackage } from "@react-native-oh-tpl/react-native-image-sequence-2/ts";
export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
return [
new SamplePackage(ctx),
+ new ImageSequencePackage(ctx)
];
}
点击右上角的 sync
按钮
或者在终端执行:
cd entry
ohpm install
然后编译、运行即可。
请到三方库相应的 Releases 发布地址查看 Release 配套的版本信息:@react-native-ohos/react-native-image-sequence Releases
[!TIP] "Platform"列表示该属性在原三方库上支持的平台。
[!TIP] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。
Name | Description | Type | Required | Platform | HarmonyOS Support |
---|---|---|---|---|---|
images | An array of source images. Each element of the array should be the result of a call to require(imagePath) | any[] | Yes | All | Yes |
startFrameIndex | Which index of the images array should the sequence start at. Default: 0 | number | No | All | Yes |
framesPerSecond | Playback speed of the image sequence. Default: 24 | number | No | All | Yes |
loop | Should the sequence loop. Default: true | boolean | No | All | Yes |
downsampleWidth | The width to use for optional downsampling. Both downsampleWidth and downsampleHeight must be set to a positive number to enable downsampling. Default: -1 |
number | No | All | Yes |
downsampleHeight | The height to use for optional downsampling. Both downsampleWidth and downsampleHeight must be set to a positive number to enable downsampling. Default: -1 |
number | No | All | Yes |
本项目基于 The MIT License (MIT) ,请自由地享受和参与开源。