使用属性动画
ArkUI开发框架在NDK接口主要提供属性动画,实现组件出现/消失转场。同时,可以通过Node-API桥接ArkTS侧帧动画能力,实现Native侧的动画效果。
说明
需要从ArkTS侧获取this.getUIContext(),传入到Native侧。
在Native侧通过OH_ArkUI_GetContextFromNapiValue方法获取context。
需要执行的动画属性变化必须写在ArkUI_ContextCallback中callback中。
需要执行的动画属性,必须在执行动画之前设置过。
提供全局animateTo显式动画接口,来指定由于闭包代码导致的状态变化插入过渡动效。同属性动画,布局类改变宽高的动画,内容都是直接到终点状态。
-
在.ets文件中获取UIContext,把this.getUIContext()当做参数输出到Native方法中。
// createNativeNode是Native侧暴露的方法 nativeNode.createNativeNode("xcomponentId", this.getUIContext());
-
解析UIContext转换C中的context对象。
// 获取ets测传入的context ArkUI_ContextHandle context = nullptr; // 通过code 判断是否获取成功 auto code = OH_ArkUI_GetContextFromNapiValue(env, args[1], &context);
-
获取ArkUI_NativeAnimateAPI_1 对象。
// 获取ArkUI_NativeAnimateAPI接口 ArkUI_NativeAnimateAPI_1 *animateApi = nullptr; OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_ANIMATE, ArkUI_NativeAnimateAPI_1, animateApi);
-
设置 ArkUI_AnimateOption参数,通过提供的C方法设置对应的参数。
ArkUI_AnimateOption *option = OH_ArkUI_AnimateOption_Create(); OH_ArkUI_AnimateOption_SetDuration(option, 2000); OH_ArkUI_AnimateOption_SetTempo(option, 1.1); OH_ArkUI_AnimateOption_SetCurve(option, ARKUI_CURVE_EASE); OH_ArkUI_AnimateOption_SetDelay(option, 20); OH_ArkUI_AnimateOption_SetIterations(option, 1); OH_ArkUI_AnimateOption_SetPlayMode(option, ARKUI_ANIMATION_PLAY_MODE_REVERSE); ArkUI_ExpectedFrameRateRange *range = new ArkUI_ExpectedFrameRateRange; range->min = 10; range->max = 120; range->expected = 60; OH_ArkUI_AnimateOption_SetExpectedFrameRateRange(option, range);
-
设置回调参数。
// 用户自定义参数 struct UserData{ int32_t data; }; UserData *onFinishUser = new UserData; onFinishUser->data= 101; // 设置完成的回调 ArkUI_AnimateCompleteCallback *completeCallback = new ArkUI_AnimateCompleteCallback; completeCallback->userData = onFinishUser; completeCallback->type = ARKUI_FINISH_CALLBACK_REMOVED; completeCallback->callback = [](void *userData) { OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Manager", "CreateNativeNode onFinishCallback %{public}d", reinterpret_cast<AA *>(userData)->a); }; // 用户自定义参数 UserData *eventUser = new UserData ; eventUser->data= 201; static bool isback = true; ArkUI_ContextCallback *update = new ArkUI_ContextCallback; update->userData = eventUser; update->callback = [](void *user) { OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "Manager", "CreateNativeNode animateTo %{public}d", reinterpret_cast<UserData*>(user)->data); // 对应的属性变化 width height if (isback) { ArkUI_NumberValue custom_widthValue[] =