A <LinearGradient> element for React Native
npm install @tuya-oh/react-native-linear-gradient> 模板版本:v3.0.1-rc.1
react-native-linear-gradient > [!TIP] Gitee 地址
进入到工程目录并输入以下命令:
#### npm
``bash`
npm install @tuya-oh/react-native-linear-gradient
#### yarn
`bash`
yarn add @tuya-oh/react-native-linear-gradient
下面的代码展示了这个库的基本使用场景:
> [!WARNING] 使用时 import 的库名不变。
`js
import React, { ReactNode } from "react";
import {
SafeAreaView,
ScrollView,
StatusBar,
StyleSheet,
Text,
View,
} from "react-native";
import LinearGradient from "react-native-linear-gradient";
// Within your render function
function LinearGradientDemo() {
return (
style={styles.linearGradient}
>
;
);
}
export default LinearGradientDemo;
// Later on in your styles..
var styles = StyleSheet.create({
container: {
backgroundColor: "#fff",
flex: 1,
paddingTop: 24,
},
linearGradient: {
flex: 1,
paddingLeft: 15,
paddingRight: 15,
borderRadius: 5,
},
buttonText: {
fontSize: 18,
fontFamily: "Gill Sans",
textAlign: "center",
margin: 10,
color: "#ffffff",
backgroundColor: "transparent",
},
});
`
此步骤为手动配置原生依赖项的指导。
首先需要使用 DevEco Studio 打开项目里的 HarmonyOS 工程 harmony。
`json`
{
"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 包引入;
- 直接链接源码。
方法一:通过 har 包引入(推荐)
> [!TIP] har 包位于三方库安装路径的 harmony 文件夹下。
打开 entry/oh-package.json5,添加以下依赖
`json`
"dependencies": {
"@tuya-oh/react-native-linear-gradient": "file:../../node_modules/@tuya-oh/react-native-linear-gradient/harmony/linear_gradient.har"
}
点击右上角的 sync 按钮
或者在终端执行:
`bash`
cd entry
ohpm install
方法二:直接链接源码
> [!TIP] 如需使用直接链接源码,请参考直接链接源码说明
打开 entry/src/main/cpp/CMakeLists.txt,添加:
`diff
+ set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
打开
entry/src/main/cpp/PackageProvider.cpp,添加:`diff
#include "RNOH/PackageProvider.h"
#include "generated/RNOHGeneratedPackage.h"
+ #include "LinearGradientPackage.h"using namespace rnoh;
std::vector> PackageProvider::getPackages(Package::Context ctx) {
return {
std::make_shared(ctx),
+ std::make_shared(ctx)
};
}
`$3
点击右上角的
sync 按钮或者在终端执行:
`bash
cd entry
ohpm install
`然后编译、运行即可。
$3
> 执行完'npm i @tuya-oh/react-native-linear-gradient@x.x.x'命令后,在生成的node_modules/@tuya-oh/react-native-linear-gradient中即可获取release包。打开
entry/src/main/cpp/CMakeLists.txt,添加:`diff
project(rnapp)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(NATIVERENDER_ROOT_PATH "${CMAKE_CURRENT_SOURCE_DIR}")
set(OH_MODULE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
set(RNOH_CPP_DIR "${OH_MODULE_DIR}/@rnoh/react-native-openharmony/include")
set(REACT_COMMON_PATCH_DIR "${RNOH_CPP_DIR}/patches/react_native_core")set(CMAKE_CXX_STANDARD 17)
set(LOG_VERBOSITY_LEVEL 1)
set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments")
set(RNOH_GENERATED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/generated")
set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie -DNDEBUG")
set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use
add_compile_definitions(WITH_HITRACE_SYSTRACE)
folly的编译选项
set(folly_compile_options
-DFOLLY_NO_CONFIG=1
-DFOLLY_MOBILE=1
-DFOLLY_USE_LIBCPP=1
-DFOLLY_HAVE_RECVMMSG=1
-DFOLLY_HAVE_PTHREAD=1
-Wno-comma
-Wno-shorten-64-to-32
-Wno-documentation
-faligned-new
)
add_compile_options("-Wno-unused-command-line-argument")
添加头文件目录
include_directories(${NATIVERENDER_ROOT_PATH}
${RNOH_CPP_DIR}
${REACT_COMMON_PATCH_DIR}
${RNOH_CPP_DIR}/third-party/folly
${RNOH_CPP_DIR}/third-party/rn/ReactCommon
${RNOH_CPP_DIR}/third-party/rn/ReactCommon/react/nativemodule/core
${RNOH_CPP_DIR}/third-party/rn/ReactCommon/jsi
${RNOH_CPP_DIR}/third-party/rn/ReactCommon/callinvoker
${RNOH_CPP_DIR}/third-party/boost/libs/utility/include
${RNOH_CPP_DIR}/third-party/boost/libs/stacktrace/include
${RNOH_CPP_DIR}/third-party/boost/libs/predef/include
${RNOH_CPP_DIR}/third-party/boost/libs/array/include
${RNOH_CPP_DIR}/third-party/boost/libs/throw_exception/include
${RNOH_CPP_DIR}/third-party/boost/libs/config/include
${RNOH_CPP_DIR}/third-party/boost/libs/core/include
${RNOH_CPP_DIR}/third-party/boost/libs/preprocessor/include
${RNOH_CPP_DIR}/third-party/double-conversion
${RNOH_CPP_DIR}/third-party/rn/ReactCommon/react/renderer/graphics/platform/cxx
${RNOH_CPP_DIR}/third-party/rn/ReactCommon/runtimeexecutor
${RNOH_CPP_DIR}/third-party/glog/src
${RNOH_CPP_DIR}/third-party/boost/libs/mpl/include
${RNOH_CPP_DIR}/third-party/boost/libs/type_traits/include
${RNOH_CPP_DIR}/third-party/rn/ReactCommon/yoga
${RNOH_CPP_DIR}/third-party/boost/libs/intrusive/include
${RNOH_CPP_DIR}/third-party/boost/libs/assert/include
${RNOH_CPP_DIR}/third-party/boost/libs/move/include
${RNOH_CPP_DIR}/third-party/boost/libs/static_assert/include
${RNOH_CPP_DIR}/third-party/boost/libs/container_hash/include
${RNOH_CPP_DIR}/third-party/boost/libs/describe/include
${RNOH_CPP_DIR}/third-party/boost/libs/mp11/include
${RNOH_CPP_DIR}/third-party/boost/libs/iterator/include
${RNOH_CPP_DIR}/third-party/boost/libs/detail/include
${RNOH_CPP_DIR}/patches/react_native_core/react/renderer/textlayoutmanager/platform/harmony
+ ${OH_MODULE_DIR}/@tuya-oh/react-native-linear-gradient/include
)configure_file(
${RNOH_CPP_DIR}/third-party/folly/CMake/folly-config.h.cmake
${RNOH_CPP_DIR}/third-party/folly/folly/folly-config.h
)
file(GLOB GENERATED_CPP_FILES "./generated/*.cpp")
添加rnoh动态共享包
add_library(rnoh SHARED
"${RNOH_CPP_DIR}/RNOHOther.cpp"
"${RNOH_CPP_DIR}/third-party/folly/folly/lang/SafeAssert.cpp"
)
链接其他so
target_link_directories(rnoh PUBLIC ${OH_MODULE_DIR}/@rnoh/react-native-openharmony/libs/arm64-v8a)+ target_link_directories(rnoh PUBLIC ${OH_MODULE_DIR}/@tuya-oh/react-native-linear-gradient/libs/arm64-v8a)
target_link_libraries(rnoh PUBLIC
rnoh_semi
libace_napi.z.so
libace_ndk.z.so
librawfile.z.so
libhilog_ndk.z.so
libnative_vsync.so
libnative_drawing.so
libc++_shared.so
libhitrace_ndk.z.so
react_render_scheduler
rrc_image
rrc_text
rrc_textinput
rrc_scrollview
react_nativemodule_core
react_render_animations
jsinspector
hermes
jsi
logger
react_config
react_debug
react_render_attributedstring
react_render_componentregistry
react_render_core
react_render_debug
react_render_graphics
react_render_imagemanager
react_render_mapbuffer
react_render_mounting
react_render_templateprocessor
react_render_textlayoutmanager
react_render_telemetry
react_render_uimanager
react_utils
rrc_root
rrc_view
react_render_leakchecker
react_render_runtimescheduler
runtimeexecutor
+ rnoh_linear-gradient
)
if("$ENV{RNOH_C_API_ARCH}" STREQUAL "1")
message("Experimental C-API architecture enabled")
target_link_libraries(rnoh PUBLIC libqos.so)
target_compile_definitions(rnoh PUBLIC C_API_ARCH)
endif()
添加rnoh_app共享包
add_library(rnoh_app SHARED
${GENERATED_CPP_FILES}
"./PackageProvider.cpp"
"${RNOH_CPP_DIR}/RNOHOther.cpp"
"${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
)+ target_include_directories(rnoh_app PUBLIC
+ "${OH_MODULE_DIR}/@tuya-oh/+ react-native-linear-gradient/include"
+ "${OH_MODULE_DIR}/@tuya-oh/+ react-native-linear-gradient/include/generated"
+ "${OH_MODULE_DIR}/@tuya-oh/+ react-native-linear-gradient/include/generated/react"
+ )
target_link_libraries(rnoh_app PUBLIC rnoh)
RNOH_END: link_packages
target_compile_options(rnoh_app PUBLIC ${folly_compile_options} -DRAW_PROPS_ENABLED -std=c++17)
`
$3
字节码格式的release包是指在release模式下编译出来、ets文件转换成了.abc、C++源码转换成.so的har包,其命名格式为 react_native_openharmony_abc-x.x.x.xxx.har。
字节码格式的release包使用方式跟release包使用大体上是一样的,主要有两点需要注意:
1. 使用字节码格式的release包需要将工程级的 build-profile.json5 文件中将 useNormalizedOHMUrl 设置为 true,如:
`diff
"products": [
{
"name": "default",
"signingConfig": "default",
"compatibleSdkVersion": "5.0.1(13)",
"runtimeOS": "HarmonyOS",
+ "buildOption": {
+ "strictMode": {
+ "useNormalizedOHMUrl": true
+ }
+ }
}
],
``请到三方库相应的 Releases 发布地址查看 Release 配套的版本信息:@tuya-oh/react-native-linear-gradient Releases
> [!TIP] "Platform" 列表示这些属性在原始第三方库中支持的平台。
> [!TIP] "如果“HarmonyOS 支持”列的值为“yes”,则表示 HarmonyOS 平台支持该属性;“no”则表示不支持;“partially”表示部分支持该属性的功能。该属性在不同平台上的使用方法相同,效果与 iOS 或 Android 平台一致。
| Name | Description | Type | Required | Platform | HarmonyOS Support |
| ----------- | -------------------------------------------------------- | ---------------------- | -------- | -------- | ----------------- |
| colors | Color Array | (string\|number)[] | YES | All | yes |
| locations | Color for unknown array (length 0 or the same as colors) | number[] | NO | All | yes |
| useAngle | Use angle (default false) | boolean | NO | All | yes |
| angle | Angle (useAngle=true valid) | number | NO | All | yes |
| angleCenter | Middle angle coordinate | { x: number,y: number} | NO | All | no |
| start | Starting point coordinates (default value: {x: 0.5,1}) | { x: number,y: number} | NO | All | yes |
| end | End point coordinates (default value: {x: 0.5,1}) | { x: number,y: number} | NO | All | yes |
- HarmonyOS 当前版本暂时无法实现 angleCenter
本项目基于 The MIT License (MIT),请自由地享受和参与开源。