华为仓颉鸿蒙HarmonyOS NEXT ArkTS应用使用仓颉混合开发实例

开发过程中难免遇到需要使用混合开发的场景,今天简单介绍一下在ArkTS应用中使用仓颉的例子!希望对大家有帮助

仓颉作为HarmonyOS应用开发语言,开发者使用仓颉进行应用开发涉及以下2种场景:

  • ​ 场景1:开发纯仓颉应用,即应用中全量功能都使用仓颉语言开发;
  • ​ 场景2:在ArkTS应用中,使用仓颉开发部分应用逻辑;

后者会涉及混合使用ArkTS和仓颉两种语言开发UI逻辑的情况,即UI页面中同时包含由ArkTS和仓颉开发的页面/组件。

借助ArkUI 的 XComponent的能力,以及仓颉与ArkTS互操作,可以实现仓颉和ArkTS的混合开发。仓颉组件可作为XComponent的内容嵌入ArkTS页面中。

与纯仓颉开发模式的异同

相同点:

  • ​混合UI场景下的页面和纯仓颉写法基本一致
  • ​状态管理支持@State、@Link、@Prop、@Observed、@Publish、@Provide、@Consume,但不支持跨语言的状态同步。

不同点:

区别体现在生命周期和页面跳转上。

  • ​混合UI场景的仓颉页面不是一个真正意义上具有完整生命周期的页面,不支持页面生命周期接口。
  • ​无法在仓颉页面中使用仓颉的router进行页面跳转。
  • ​当前混合场景仅支持部分组件,参考混合页面支持情况。

混合页面支持情况

组件名 支持现状
AlphabetIndexer 暂不支持borderRadius。
Button 暂不支持borderRadius。
Flex Flex内子组件暂不支持基于Flex宽高设置百分比,当子组件宽高大于Flex时,将限定为Flex的宽高大小。
Grid Grid创建时暂不支持scroller参数。
Image 暂不支持onFinish;暂不支持onError事件的回调参数CJImageError,返回参数的componentWidth和componentHeight都为固定值0.0;额外支持colorFilter(ColorFilter)、ColorFilter。
ListItemGroup ListItemGroup创建时暂不支持输入ListItemGroupParams类型的参数。
List List创建时仅支持space参数,暂不支持:onItemDelete、onScrollIndex、onScroll、onScrollFrameBegin、onReachStart、onReachEnd、onScrollStart、onScrollStop。
LoadingProgress 支持接口enableLoading(value: Bool):设置LoadingProgress动画显示或者不显示。
Scroll 暂不支持:onScrollEnd(已废弃)、scrollBy。
Stack Stack内不支持使用条件渲染 if/else。
Swiper 暂不支持:onChange、finishAnimation。
TextInput 暂不支持:inputFilter、onCopy、padding、backgroundColor、borderStyle、borderRadius、borderColor、borderWidth。
TextPicker onChange事件只能获取到index值。
CustomDialog 暂不支持设置动画属性。
通用属性 支持现状
backgroundImagePosition(align: Alignment) 不支持
bindMenu 不支持
bindContextMenu 不支持
transition 不支持
aspectRatio 不支持
displayPriority 不支持
colorBlend 不支持
backdropBlur 不支持
saturate 不支持
hueRotate 不支持
position 不支持
flexBasis(value: Length) 不支持
flexBasis(value: CJResource) 不支持
foregroundColor 不支持
通用事件 支持现状
onHover 不支持
onMouse 不支持
onKeyEvent 不支持

colorFilter(ColorFilter)

public func colorFilter(value: ColorFilter): This

为图像设置颜色滤镜效果。

参数名 参数类型 必填 默认值 描述
value ColorFilter - 给图像设置颜色滤镜效果,入参为一个的4x5的RGBA转换矩阵。矩阵第一行表示R(红色)的向量值,第二行表示G(绿色)的向量值,第三行表示B(蓝色)的向量值,第四行表示A(透明度)的向量值,4行分别代表不同的RGBA的向量值。当矩阵对角线值为1,其余值为0时,保持图片原有色彩。计算规则:如果输入的滤镜矩阵为:像素点为[R, G, B, A]则过滤后的颜色为 [R’, G’, B’, A’]说明:svg类型图源不支持该属性。

ColorFilter

创建具有4*5矩阵的颜色过滤器。

public class ColorFilter {
        init(array: Array<Float32>)
    }
参数名 参数类型 必填 默认值 描述
array Array - 创建具有45矩阵的颜色过滤器, 入参为[mn]位于m行和n列中矩阵值, 矩阵是行优先的。

混合页面工程

混合页面工程,依赖仓颉与 ArkTS 互操作能力,首先需要参考 "在 ArkTS (+ C++)的HAP或HAR中创建仓颉模块" 章节,创建一个 ArkTS 仓颉混合工程,然后参考 "添加供ArkTS调用的页面组件" 章节,添加一个混合页面,按照以上步骤可以完成混合UI工程的配置。

添加仓颉UI代码

修改./entry/src/main/cangjie/src/index.cj,示例代码如下

package entry
    
    import cj_res_entry.*
    import ohos.component_ndk.*
    import ohos.state_manage_ndk.*
    import ohos.state_macro_manage_ndk.*
    import ohos.base.*
    import ohos.hybrid_base.*
    
    @HybridComponentEntry
    @Component
    class MyPage {
        @State
        var msg: String = "Hello"
    
        public func build() {
            Column {
                Text(msg)
                Button("click to change Text").onClick{=>
                    msg = "world"
                }
            }
        }
    }

ArkTS页面中插入仓颉UI

修改./entry/src/main/ets/pages/Index.ets,示例如下

import { CJHybridComponent } from "hybridView" // 导入CJHybridComponent
    
    @Entry
    @Component
    struct Index {
      build() {
        Column() {
          CJHybridComponent({
            library: "entry",      // 指定加载的仓颉package,对应上面的仓颉UI所在的包名
            component: "MyPage"    // 指定加载的仓颉class,对应上面仓颉UI中使用@HybridComponentEntry修饰的class
          })
        }
        .height('100%')
        .width('100%')
      }
    }

按照上述操作,可以完成一个简单的混合UI工程创建

posted @ 2024-12-24 21:36  BisonLiu  阅读(286)  评论(0)    收藏  举报