在FullCustomTransition.ets的Column组件中添加TransitionElement组件,并且定义pageTransition方法。给Stack组件添加opacity、scale、rotate属性,定义变量animValue用来控制Stack组件的动效,在PageTransitionEnter和PageTransitionExit组件中动态改变myProgress的值。
// FullCustomTransition.ets
@Entry
@Component
struct FullCustomTransition {
@State animValue: number = FULL_CUSTOM_TRANSITION_DEFAULT_ANIM_VALUE;
build() {
Column() {
TransitionElement()
}
.opacity(this.animValue)
.scale({ x: this.animValue, y: this.animValue })
.rotate({
z: FULL_CUSTOM_TRANSITION_ROTATE_Z,
angle: FULL_CUSTOM_TRANSITION_ANGLE * this.animValue
})
}
/**
- 页面转场通过全局pageTransition方法进行配置转场参数
- 进场过程中会逐帧触发onEnter回调,入参为动效的归一化进度(0 - 1)
- 进场过程中会逐帧触发onExit回调,入参为动效的归一化进度(0 - 1)
*/
pageTransition() {
PageTransitionEnter({ duration: TRANSITION_ANIMATION_DURATION, curve: Curve.Smooth })
.onEnter((type?: RouteType, progress?: number) => {
if (!progress) {
return;
}
this.animValue = progress;
});
PageTransitionExit({ duration: TRANSITION_ANIMATION_DURATION, curve: Curve.Smooth })
.onExit((type?: RouteType, progress?: number) => {
if (!progress) {
return;
}
this.animValue = FULL_CUSTOM_TRANSITION_DEFAULT_ANIM_VALUE - progress;
});
}
}
组件内转场
本节实现组件内转场动效,通过一个按钮来控制组件的添加和移除,呈现容器组件子组件添加和移除时的动效。效果如图所示:
组件转场主要通过transition属性方法配置转场参数,在组件添加和移除时会执行过渡动效,需要配合animateTo才能生效。动效时长、曲线、延时跟随animateTo中的配置。
- 在ComponentTransition.ets文件中,新建Image子组件,并添加两个transition属性,分别用于定义组件的添加动效和移除动效。
// ComponentTransition.ets
Image($r(‘app.media.bg_element’))
.TransitionEleStyles()
.transition({
type: TransitionType.Insert,
scale: COMPONENT_TRANSITION_SCALE,
opacity: COMPONENT_TRANSITION_OPACITY
})
.transition({
type: TransitionType.Delete,
rotate: COMPONENT_TRANSITION_ROTATE,
opacity: COMPONENT_TRANSITION_OPACITY
})
- 在ComponentTransition代码中,定义一个isShow变量,用于控制Image子组件的添加和移除,在Button组件的onClick事件中添加animateTo方法,来使Image子组件子组件动效生效。
// ComponentTransition.ets
@State isShow: boolean = false;
Button(
r
(
′
a
p
p
.
s
t
r
i
n
g
.
C
o
m
p
o
n
e
n
t
t
r
a
n
s
i
t
i
o
n
t
o
g
g
l
e
′
)
)
.
h
e
i
g
h
t
(
D
i
m
e
n
s
i
o
n
U
t
i
l
.
g
e
t
V
p
(
r('app.string.Component_transition_toggle')) .height(DimensionUtil.getVp(
r(′app.string.Componenttransitiontoggle′)).height(DimensionUtil.getVp(r(‘app.float.element_trans_btn_height’)))
.width(DimensionUtil.getVp(
r
(
′
a
p
p
.
f
l
o
a
t
.
e
l
e
m
e
n
t
t
r
a
n
s
b
t
n
w
i
d
t
h
′
)
)
)
.
f
o
n
t
C
o
l
o
r
(
C
o
l
o
r
.
W
h
i
t
e
)
.
b
a
c
k
g
r
o
u
n
d
C
o
l
o
r
(
r('app.float.element_trans_btn_width'))) .fontColor(Color.White) .backgroundColor(
r(′app.float.elementtransbtnwidth′))).fontColor(Color.White).backgroundColor(r(‘app.color.light_blue’))
.onClick(() => {
animateTo({ duration: TRANSITION_ANIMATION_DURATION }, () => {
this.isShow = !this.isShow;
})
})
共享元素转场
效果如图所示:
共享元素转场通过给组件设置sharedTransition属性来实现,两个页面的组件配置为同一个id,则转场过程中会执行共享元素转场。sharedTransition可以设置动效的时长、动画曲线和延时,实现步骤如下:
- 在ShareItem.ets中给Image组件设置sharedTransition属性,组件转场id设置为“SHARE_TRANSITION_ID”。
// ShareItem.ets
Image(
r
(
′
a
p
p
.
m
e
d
i
a
.
b
g
t
r
a
n
s
i
t
i
o
n
′
)
)
.
w
i
d
t
h
(
F
U
L
L
L
E
N
G
T
H
)
.
h
e
i
g
h
t
(
D
i
m
e
n
s
i
o
n
U
t
i
l
.
g
e
t
V
p
(
r('app.media.bg_transition')) .width(FULL_LENGTH) .height(DimensionUtil.getVp(
r(′app.media.bgtransition′)).width(FULLLENGTH).height(DimensionUtil.getVp(r(‘app.float.share_item_element_height’)))
.borderRadius(DimensionUtil.getVp(KaTeX parse error: Expected '}', got 'EOF' at end of input: …sionUtil.getVp(r(‘app.float.share_item_element_margin_bottom’)) })
.sharedTransition(SHARE_TRANSITION_ID, {
duration: TRANSITION_ANIMATION_DURATION,
curve: Curve.Smooth,
delay: SHARE_ITEM_ANIMATION_DELAY
})
.onClick(() => {
router.pushUrl({ url: SHARE_PAGE_URL })
.catch((err: Error) => {
hilog.error(DOMAIN, PREFIX, FORMAT, err);
});
})
- 在SharePage.ets中给Image组件设置sharedTransition属性,组件转场id设置为“SHARE_TRANSITION_ID”。
// SharePage.ets
@Entry
@Component
struct SharePage {
build() {
Column() {
TransitionElement({ imgFit: ImageFit.Cover })
.sharedTransition(SHARE_TRANSITION_ID, {
duration: SHARE_ITEM_DURATION,
curve: Curve.Smooth,
delay: SHARE_ITEM_ANIMATION_DELAY
})
}
}
}
说明: 两个页面的组件配置为同一个id,则转场过程中会执行共享元素转场,配置为空字符串时不会有共享元素转场效果。
最后
有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。
这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(**ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony****多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)**技术知识点。
希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!
如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料
获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料****
鸿蒙(HarmonyOS NEXT)最新学习路线
- HarmonOS基础技能
- HarmonOS就业必备技能
- HarmonOS多媒体技术
- 鸿蒙NaPi组件进阶
- HarmonOS高级技能
- 初识HarmonOS内核
- 实战就业级设备开发
有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。
获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
《鸿蒙 (OpenHarmony)开发入门教学视频》
《鸿蒙生态应用开发V2.0白皮书》
《鸿蒙 (OpenHarmony)开发基础到实战手册》
OpenHarmony北向、南向开发环境搭建
《鸿蒙开发基础》
- ArkTS语言
- 安装DevEco Studio
- 运用你的第一个ArkTS应用
- ArkUI声明式UI开发
- .……
《鸿蒙开发进阶》
- Stage模型入门
- 网络管理
- 数据管理
- 电话服务
- 分布式应用开发
- 通知与窗口管理
- 多媒体技术
- 安全技能
- 任务管理
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数HarmonyOS鸿蒙开发工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年HarmonyOS鸿蒙开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上HarmonyOS鸿蒙开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
rmonyOS鸿蒙开发知识点,真正体系化!**
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注鸿蒙获取)
[外链图片转存中…(img-76xYpHxI-1712691841953)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!