0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在OpenHarmony上实现弹性动效的方法

OpenHarmony威廉希尔官方网站 社区 来源:OST开源开发者 2023-06-11 15:12 次阅读

在动画开发场景中,经常用到弹性效果,尤其在拖拽某个对象时经常伴随弹性动效。

OpenHarmony 提供了三种弹簧动画曲线用来实现弹性效果,本例将为大家介绍这三种曲线的用法。

最终效果如下:

2b1ce6cc-0826-11ee-962d-dac502259ad0.gif

运行环境

本例基于以下环境开发,开发者也可以基于其他适配的版本进行开发:

IDE:DevEco Studio 3.1 Beta2

SDK:Ohos_sdk_public 3.2.11.9(API Version 9 Release)

实现思路

本例主要用到以下三种弹簧动画曲线:

curves.springCurve:通过设置弹簧的初始速度、质量、刚度和阻尼来控制弹簧动画的效果。对应本例中 springCurve 按钮触发的动画。

curves.springMotion:通过设置弹簧震动时间和阻尼来控制弹簧动画的效果。对应本例中 springMotion 按钮触发的动画。

curves.responsiveSpringMotion:构造弹性跟手动画曲线对象,是springMotion的一种特例,仅默认参数不同,可与 springMotion 混合使用。用来实现拖拽动画。

开发步骤

①搭建 UI 框架

样例中有两个按钮,一个图片。内容整体纵向分布,两个按钮横向分布。纵向布局可以采用 Column 组件,横向布局可以采用 Row 组件。

代码如下:

@Entry
@Component
structImageComponent{
build(){
Column(){
Row(){
Button('springCurve')
.margin({right:10})
.fontSize(20)
.backgroundColor('#18183C')
Button('springMotion')
.fontSize(20)
.backgroundColor('#18183C')
}
.margin({top:30})

Image($r("app.media.contact2"))
.width(100)
.height(100)
}.width("100%").height("100%").backgroundColor('#A4AE77')
}
}
②为 springCurve 按钮添加 curves.springCurve 的曲线动画。
...
//定义状态变量translateY,用来控制笑脸图像的位移
@StatetranslateY:number=0
...
Button('springCurve')
.margin({right:10})
.fontSize(20)
.backgroundColor('#18183C')
//绑定点击事件
.onClick(()=>{
//在点击事件中添加显示动画
animateTo({
duration:2000,
//设定curves.springCurve为动画曲线
curve:curves.springCurve(100,10,80,10)
},
()=>{
//改变translateY的值,使笑脸图像发生位移
this.translateY=-20
})
this.translateY=0
})
...
Image($r("app.media.contact2"))
.width(100)
.height(100)
//为笑脸图像添加位移属性,以translateY为参数
.translate({y:this.translateY})
...
效果如下:

2ba2ebdc-0826-11ee-962d-dac502259ad0.gif

③为 springMotion 按钮添加 curves.springMotion 曲线动画。

这里通过 position 属性控制 springMotion 按钮的移动,当然开发者也可以继续选择使用 translate 属性。

...
//定义状态变量translateY,用来控制笑脸图像的位置变化
@StateimgPos:{
x:number,
y:number
}={x:125,y:400}
...
Button('springMotion')
.fontSize(20)
.backgroundColor('#18183C')
//绑定点击事件
.onClick(()=>{
//在点击事件中添加显示动画
animateTo({
duration:15,
//设定curves.springMotion为动画曲线
curve:curves.springMotion(0.5,0.5),
onFinish:()=>{
animateTo({duration:500,
curve:curves.springMotion(0.5,0.5),},()=>{
//动画结束时笑脸图像位置还原
this.imgPos={x:125,y:400}
})
}
},()=>{
//改变笑脸图像位置,y轴位置由400,变为150
this.imgPos={x:125,y:150}
})
})
...
Image($r("app.media.contact2"))
.width(100)
.height(100)
.translate({y:this.translateY})
//为笑脸图像添加位置属性,以imgPos为参数
.position(this.imgPos)
...
效果如下:

2be677f8-0826-11ee-962d-dac502259ad0.gif

④使用 curves.responsiveSpringMotion 为笑脸图像添加拖拽动画。
...
Image($r("app.media.contact2"))
.width(100)
.height(100)
.translate({y:this.translateY})
.position(this.imgPos)
//绑定触摸事件
.onTouch((event:TouchEvent)=>{
//当触摸放开时,笑脸图像位置还原
if(event.type==TouchType.Up){
animateTo({
duration:50,
delay:0,
curve:curves.springMotion(),
onFinish:()=>{
}
},()=>{
this.imgPos={x:125,y:400}
})
}else{
//触摸过程中触发跟手动画
animateTo({
duration:50,
delay:0,
//设定跟手动画曲线
curve:curves.responsiveSpringMotion(),
onFinish:()=>{
}
},()=>{
//根据触点位置改变笑脸图像位置,从而实现跟手动画
this.imgPos={
x:event.touches[0].screenX-100/2,
y:event.touches[0].screenY-100/2
}
})
}
})
...
效果如下:

2c0585f8-0826-11ee-962d-dac502259ad0.gif  

完整代码

本例完整代码如下:

importcurvesfrom'@ohos.curves';

@Entry
@Component
structImageComponent{
//定义状态变量translateY,用来控制笑脸图像的位移
@StatetranslateY:number=0
//定义状态变量translateY,用来控制笑脸图像的位置变化
@StateimgPos:{
x:number,
y:number
}={x:125,y:400}

build(){
Column(){
Row(){
Button('springCurve')
.margin({right:10})
.fontSize(20)
.backgroundColor('#18183C')
//绑定点击事件
.onClick(()=>{
//在点击事件中添加显示动画
animateTo({
duration:2000,
//设定curves.springCurve为动画曲线
curve:curves.springCurve(100,10,80,10)
},
()=>{
//改变translateY的值,使笑脸图像发生位移
this.translateY=-20
})
this.translateY=0
})
Button('springMotion')
.fontSize(20)
.backgroundColor('#18183C')
//绑定点击事件
.onClick(()=>{
//在点击事件中添加显示动画
animateTo({
duration:15,
//设定curves.springMotion为动画曲线
curve:curves.springMotion(0.5,0.5),
onFinish:()=>{
animateTo({duration:500,
curve:curves.springMotion(0.5,0.5),},()=>{
//动画结束时笑脸图像位置还原
this.imgPos={x:125,y:400}
})
}
},()=>{
//改变笑脸图像位置,y轴位置由400,变为150
this.imgPos={x:125,y:150}
})
})
}
.margin({top:30})

Image($r("app.media.contact2"))
.width(100)
.height(100)
//为笑脸图像添加位移属性,以translateY为参数
.translate({y:this.translateY})
//为笑脸图像添加位置属性,以imgPos为参数
.position(this.imgPos)
//绑定触摸事件
.onTouch((event:TouchEvent)=>{
//当触摸放开时,笑脸图像位置还原
if(event.type==TouchType.Up){
animateTo({
duration:50,
delay:0,
curve:curves.springMotion(),
onFinish:()=>{
}
},()=>{
this.imgPos={x:125,y:400}
})
}else{
//触摸过程中触发跟手动画,同样通过animateTo实现动画效果
animateTo({
duration:50,
delay:0,
//设定跟手动画曲线
curve:curves.responsiveSpringMotion(),
onFinish:()=>{
}
},()=>{
//根据触点位置改变笑脸图像位置,从而实现跟手动画
this.imgPos={
x:event.touches[0].screenX-100/2,
y:event.touches[0].screenY-100/2
}
})
}
})
}.width("100%").height("100%").backgroundColor('#A4AE77')
}
}



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 触摸屏
    +关注

    关注

    42

    文章

    2309

    浏览量

    116361
  • OpenHarmony
    +关注

    关注

    25

    文章

    3728

    浏览量

    16393

原文标题:OpenHarmony上实现弹性动效

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony威廉希尔官方网站 社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    家庭、单位用电安全,需要“弹性范围内、弹性连接”的接线端子

    出螺丝端部对导线的压力0.549--1.16KN,实测的压力数据35---90公斤之间,测试的工具与方法不同,数值会有偏差,从定性的角度说明压力值还是比较大的。2、弹性范围内的
    发表于 03-19 15:25

    设计的这些设计流程你知道吗

    交互设计师想要认真和你聊聊设计
    发表于 02-25 06:39

    OpenHarmony 3.1 Beta版本关键特性解析——OpenHarmony图形框架

    绘制与渲染流程解决了跨窗口联动问题后,上面示例中桌面和壁纸模糊效果呈现时,也能同步看到壁纸的,如下:此外,OpenHarmony 图形栈从时间和空间提供了更丰富的
    发表于 04-13 18:24

    为什么要在OpenHarmony设备安装Dropbear呢

    HDC足够大多数人的需求。但你如果更喜欢使用ssh协议,或者有更多高级需求例如基于网络进行连接,支持密码认证,提供安全可信的加密通道多台开发机或设备同时连接OpenHarmony设备使用WinSCP
    发表于 05-23 17:45

    app图标openharmony的源码哪里实现的?

    openharmony点击一个app图标的之后,应用会从左上角一点点放大直至铺满屏幕;我想问一下这个openharmony的源码
    发表于 06-10 11:01

    OpenHarmony 官网文档有哪些新?上篇:应用开发文档

    TS 语言并进行声明式 UI 语法扩展,从组件、和状态管理三个维度提供了 UI 绘制能力。UI 开发更接近自然语义的编程方式,让开发者直观地描述 UI 界面,不必关心框架如何实现 UI 绘制和渲染
    发表于 06-14 11:17

    网络组件axios可以OpenHarmony使用了

    网络组件axios可以OpenHarmony使用了什么是axios上古浏览器页面向服务器请求数据时,因为返回的是整个页面的数据,页面都会强制刷新一下,这对于用户来讲并不是很友好。
    发表于 08-29 12:11

    开源图形驱动OpenHarmony的使用和落地

    。 03►开源图形驱动OpenHarmony的移植 OpenHarmony驱动框架支持多种接入模式,能够实现南向硬件的快速部署。其中,
    发表于 08-31 18:07

    云计算弹性评测模型的研究与实现

    问题,从资源分配、QoS、资源配置时间等多个角度,对云计算的弹性进行较为全面的分析,提出适用于供应商和用户两个角度的评测方法已有基础,提出资源分配、资源配置时间两个方面的计算模型
    发表于 11-27 14:42 0次下载

    基于距离徙校正的弹速补偿FPGA实现方法

    针对高速运动平台弹速补偿的实时性要求,基于距离徙校正(Range Cell Migration Compensation,RCMC) 的思想上提出了一种弹速补偿的FPGA实现方法
    发表于 03-30 09:56 2700次阅读
    基于距离徙<b class='flag-5'>动</b>校正的弹速补偿FPGA<b class='flag-5'>实现</b><b class='flag-5'>方法</b>

    华为图像服务场景Java示例代码

    简介 场景服务提供基础和高级,帮助您实现
    发表于 03-23 11:06 0次下载

    OpenHarmony生态论坛:支付终端OpenHarmony的安全框架

    OpenHarmony生态论坛:支付终端OpenHarmony的安全框架
    的头像 发表于 04-25 17:29 1481次阅读
    <b class='flag-5'>OpenHarmony</b>生态论坛:支付终端<b class='flag-5'>在</b><b class='flag-5'>OpenHarmony</b><b class='flag-5'>上</b>的安全框架

    OpenHarmony生态论坛:UROVOOpenHarmony的规划和实践

    OpenHarmony生态论坛:UROVOOpenHarmony的规划和实践
    的头像 发表于 04-25 17:33 1362次阅读
    <b class='flag-5'>OpenHarmony</b>生态论坛:UROVO<b class='flag-5'>在</b><b class='flag-5'>OpenHarmony</b><b class='flag-5'>上</b>的规划和实践

    如何在OpenHarmony实现​翻页呢?

    翻页是应用开发中常见的场景,常见的如书籍翻页、日历翻页等。
    的头像 发表于 06-11 15:15 720次阅读
    如何在<b class='flag-5'>OpenHarmony</b><b class='flag-5'>上</b><b class='flag-5'>实现</b>​翻页<b class='flag-5'>动</b><b class='flag-5'>效</b>呢?

    OpenHarmony实战开发-如何实现组件动画。

    ArkUI为组件提供了通用的属性动画和转场动画能力的同时,还为一些组件提供了默认的动画效果。例如,List的滑动动,Button的点击,是组件自带的默认动画效果。组件默认动画效
    的头像 发表于 04-28 15:49 644次阅读
    <b class='flag-5'>OpenHarmony</b>实战开发-如何<b class='flag-5'>实现</b>组件动画。