0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在OpenHarmony上實(shí)現(xiàn)彈性動(dòng)效的方法

OpenHarmony技術(shù)社區(qū) ? 來源:OST開源開發(fā)者 ? 2023-06-11 15:12 ? 次閱讀

在動(dòng)畫開發(fā)場(chǎng)景中,經(jīng)常用到彈性效果,尤其在拖拽某個(gè)對(duì)象時(shí)經(jīng)常伴隨彈性動(dòng)效。

OpenHarmony 提供了三種彈簧動(dòng)畫曲線用來實(shí)現(xiàn)彈性效果,本例將為大家介紹這三種曲線的用法。

最終效果如下:

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

運(yùn)行環(huán)境

本例基于以下環(huán)境開發(fā),開發(fā)者也可以基于其他適配的版本進(jìn)行開發(fā):

IDE:DevEco Studio 3.1 Beta2

SDK:Ohos_sdk_public 3.2.11.9(API Version 9 Release)

實(shí)現(xiàn)思路

本例主要用到以下三種彈簧動(dòng)畫曲線:

curves.springCurve:通過設(shè)置彈簧的初始速度、質(zhì)量、剛度和阻尼來控制彈簧動(dòng)畫的效果。對(duì)應(yīng)本例中 springCurve 按鈕觸發(fā)的動(dòng)畫。

curves.springMotion:通過設(shè)置彈簧震動(dòng)時(shí)間和阻尼來控制彈簧動(dòng)畫的效果。對(duì)應(yīng)本例中 springMotion 按鈕觸發(fā)的動(dòng)畫。

curves.responsiveSpringMotion:構(gòu)造彈性跟手動(dòng)畫曲線對(duì)象,是springMotion的一種特例,僅默認(rèn)參數(shù)不同,可與 springMotion 混合使用。用來實(shí)現(xiàn)拖拽動(dòng)畫。

開發(fā)步驟

①搭建 UI 框架

樣例中有兩個(gè)按鈕,一個(gè)圖片。內(nèi)容整體縱向分布,兩個(gè)按鈕橫向分布??v向布局可以采用 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 的曲線動(dòng)畫。
...
//定義狀態(tài)變量translateY,用來控制笑臉圖像的位移
@StatetranslateY:number=0
...
Button('springCurve')
.margin({right:10})
.fontSize(20)
.backgroundColor('#18183C')
//綁定點(diǎn)擊事件
.onClick(()=>{
//在點(diǎn)擊事件中添加顯示動(dòng)畫
animateTo({
duration:2000,
//設(shè)定curves.springCurve為動(dòng)畫曲線
curve:curves.springCurve(100,10,80,10)
},
()=>{
//改變translateY的值,使笑臉圖像發(fā)生位移
this.translateY=-20
})
this.translateY=0
})
...
Image($r("app.media.contact2"))
.width(100)
.height(100)
//為笑臉圖像添加位移屬性,以translateY為參數(shù)
.translate({y:this.translateY})
...
效果如下:

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

③為 springMotion 按鈕添加 curves.springMotion 曲線動(dòng)畫。

這里通過 position 屬性控制 springMotion 按鈕的移動(dòng),當(dāng)然開發(fā)者也可以繼續(xù)選擇使用 translate 屬性。

...
//定義狀態(tài)變量translateY,用來控制笑臉圖像的位置變化
@StateimgPos:{
x:number,
y:number
}={x:125,y:400}
...
Button('springMotion')
.fontSize(20)
.backgroundColor('#18183C')
//綁定點(diǎn)擊事件
.onClick(()=>{
//在點(diǎn)擊事件中添加顯示動(dòng)畫
animateTo({
duration:15,
//設(shè)定curves.springMotion為動(dòng)畫曲線
curve:curves.springMotion(0.5,0.5),
onFinish:()=>{
animateTo({duration:500,
curve:curves.springMotion(0.5,0.5),},()=>{
//動(dòng)畫結(jié)束時(shí)笑臉圖像位置還原
this.imgPos={x:125,y:400}
})
}
},()=>{
//改變笑臉圖像位置,y軸位置由400,變?yōu)?50
this.imgPos={x:125,y:150}
})
})
...
Image($r("app.media.contact2"))
.width(100)
.height(100)
.translate({y:this.translateY})
//為笑臉圖像添加位置屬性,以imgPos為參數(shù)
.position(this.imgPos)
...
效果如下:

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

④使用 curves.responsiveSpringMotion 為笑臉圖像添加拖拽動(dòng)畫。
...
Image($r("app.media.contact2"))
.width(100)
.height(100)
.translate({y:this.translateY})
.position(this.imgPos)
//綁定觸摸事件
.onTouch((event:TouchEvent)=>{
//當(dāng)觸摸放開時(shí),笑臉圖像位置還原
if(event.type==TouchType.Up){
animateTo({
duration:50,
delay:0,
curve:curves.springMotion(),
onFinish:()=>{
}
},()=>{
this.imgPos={x:125,y:400}
})
}else{
//觸摸過程中觸發(fā)跟手動(dòng)畫
animateTo({
duration:50,
delay:0,
//設(shè)定跟手動(dòng)畫曲線
curve:curves.responsiveSpringMotion(),
onFinish:()=>{
}
},()=>{
//根據(jù)觸點(diǎn)位置改變笑臉圖像位置,從而實(shí)現(xiàn)跟手動(dòng)畫
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{
//定義狀態(tài)變量translateY,用來控制笑臉圖像的位移
@StatetranslateY:number=0
//定義狀態(tài)變量translateY,用來控制笑臉圖像的位置變化
@StateimgPos:{
x:number,
y:number
}={x:125,y:400}

build(){
Column(){
Row(){
Button('springCurve')
.margin({right:10})
.fontSize(20)
.backgroundColor('#18183C')
//綁定點(diǎn)擊事件
.onClick(()=>{
//在點(diǎn)擊事件中添加顯示動(dòng)畫
animateTo({
duration:2000,
//設(shè)定curves.springCurve為動(dòng)畫曲線
curve:curves.springCurve(100,10,80,10)
},
()=>{
//改變translateY的值,使笑臉圖像發(fā)生位移
this.translateY=-20
})
this.translateY=0
})
Button('springMotion')
.fontSize(20)
.backgroundColor('#18183C')
//綁定點(diǎn)擊事件
.onClick(()=>{
//在點(diǎn)擊事件中添加顯示動(dòng)畫
animateTo({
duration:15,
//設(shè)定curves.springMotion為動(dòng)畫曲線
curve:curves.springMotion(0.5,0.5),
onFinish:()=>{
animateTo({duration:500,
curve:curves.springMotion(0.5,0.5),},()=>{
//動(dòng)畫結(jié)束時(shí)笑臉圖像位置還原
this.imgPos={x:125,y:400}
})
}
},()=>{
//改變笑臉圖像位置,y軸位置由400,變?yōu)?50
this.imgPos={x:125,y:150}
})
})
}
.margin({top:30})

Image($r("app.media.contact2"))
.width(100)
.height(100)
//為笑臉圖像添加位移屬性,以translateY為參數(shù)
.translate({y:this.translateY})
//為笑臉圖像添加位置屬性,以imgPos為參數(shù)
.position(this.imgPos)
//綁定觸摸事件
.onTouch((event:TouchEvent)=>{
//當(dāng)觸摸放開時(shí),笑臉圖像位置還原
if(event.type==TouchType.Up){
animateTo({
duration:50,
delay:0,
curve:curves.springMotion(),
onFinish:()=>{
}
},()=>{
this.imgPos={x:125,y:400}
})
}else{
//觸摸過程中觸發(fā)跟手動(dòng)畫,同樣通過animateTo實(shí)現(xiàn)動(dòng)畫效果
animateTo({
duration:50,
delay:0,
//設(shè)定跟手動(dòng)畫曲線
curve:curves.responsiveSpringMotion(),
onFinish:()=>{
}
},()=>{
//根據(jù)觸點(diǎn)位置改變笑臉圖像位置,從而實(shí)現(xiàn)跟手動(dòng)畫
this.imgPos={
x:event.touches[0].screenX-100/2,
y:event.touches[0].screenY-100/2
}
})
}
})
}.width("100%").height("100%").backgroundColor('#A4AE77')
}
}



審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 觸摸屏
    +關(guān)注

    關(guān)注

    42

    文章

    2258

    瀏覽量

    115178
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3558

    瀏覽量

    15780

原文標(biāo)題:OpenHarmony上實(shí)現(xiàn)彈性動(dòng)效

文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    家庭、單位用電安全,需要“彈性范圍內(nèi)、彈性連接”的接線端子

    出螺絲端部對(duì)導(dǎo)線的壓力0.549--1.16KN,實(shí)測(cè)的壓力數(shù)據(jù)35---90公斤之間,測(cè)試的工具與方法不同,數(shù)值會(huì)有偏差,從定性的角度說明壓力值還是比較大的。2、彈性范圍內(nèi)的
    發(fā)表于 03-19 15:25

    動(dòng)設(shè)計(jì)的這些設(shè)計(jì)流程你知道嗎

    交互設(shè)計(jì)師想要認(rèn)真和你聊聊動(dòng)設(shè)計(jì)
    發(fā)表于 02-25 06:39

    OpenHarmony 3.1 Beta版本關(guān)鍵特性解析——OpenHarmony圖形框架

    繪制與渲染流程解決了跨窗口聯(lián)動(dòng)問題后,上面示例中桌面和壁紙模糊效果呈現(xiàn)時(shí),也能同步看到壁紙的動(dòng),如下:此外,OpenHarmony 圖形棧從時(shí)間和空間提供了更豐富的
    發(fā)表于 04-13 18:24

    為什么要在OpenHarmony設(shè)備安裝Dropbear呢

    HDC足夠大多數(shù)人的需求。但你如果更喜歡使用ssh協(xié)議,或者有更多高級(jí)需求例如基于網(wǎng)絡(luò)進(jìn)行連接,支持密碼認(rèn)證,提供安全可信的加密通道多臺(tái)開發(fā)機(jī)或設(shè)備同時(shí)連接OpenHarmony設(shè)備使用WinSCP
    發(fā)表于 05-23 17:45

    app圖標(biāo)動(dòng)openharmony的源碼哪里實(shí)現(xiàn)的?

    openharmony點(diǎn)擊一個(gè)app圖標(biāo)的之后,應(yīng)用會(huì)從左上角一點(diǎn)點(diǎn)放大直至鋪滿屏幕;我想問一下這個(gè)動(dòng)openharmony的源碼
    發(fā)表于 06-10 11:01

    OpenHarmony 官網(wǎng)文檔有哪些新?上篇:應(yīng)用開發(fā)文檔

    TS 語(yǔ)言并進(jìn)行聲明式 UI 語(yǔ)法擴(kuò)展,從組件、動(dòng)和狀態(tài)管理三個(gè)維度提供了 UI 繪制能力。UI 開發(fā)更接近自然語(yǔ)義的編程方式,讓開發(fā)者直觀地描述 UI 界面,不必關(guān)心框架如何實(shí)現(xiàn) UI 繪制和渲染
    發(fā)表于 06-14 11:17

    網(wǎng)絡(luò)組件axios可以OpenHarmony使用了

    網(wǎng)絡(luò)組件axios可以OpenHarmony使用了什么是axios上古瀏覽器頁(yè)面向服務(wù)器請(qǐng)求數(shù)據(jù)時(shí),因?yàn)榉祷氐氖钦麄€(gè)頁(yè)面的數(shù)據(jù),頁(yè)面都會(huì)強(qiáng)制刷新一下,這對(duì)于用戶來講并不是很友好。
    發(fā)表于 08-29 12:11

    開源圖形驅(qū)動(dòng)OpenHarmony的使用和落地

    。 03?開源圖形驅(qū)動(dòng)OpenHarmony的移植 OpenHarmony驅(qū)動(dòng)框架支持多種接入模式,能夠實(shí)現(xiàn)南向硬件的快速部署。其中,
    發(fā)表于 08-31 18:07

    云計(jì)算彈性評(píng)測(cè)模型的研究與實(shí)現(xiàn)

    問題,從資源分配、QoS、資源配置時(shí)間等多個(gè)角度,對(duì)云計(jì)算的彈性進(jìn)行較為全面的分析,提出適用于供應(yīng)商和用戶兩個(gè)角度的評(píng)測(cè)方法已有基礎(chǔ),提出資源分配、資源配置時(shí)間兩個(gè)方面的計(jì)算模型
    發(fā)表于 11-27 14:42 ?0次下載

    基于距離徙動(dòng)校正的彈速補(bǔ)償FPGA實(shí)現(xiàn)方法

    針對(duì)高速運(yùn)動(dòng)平臺(tái)彈速補(bǔ)償?shù)膶?shí)時(shí)性要求,基于距離徙動(dòng)校正(Range Cell Migration Compensation,RCMC) 的思想上提出了一種彈速補(bǔ)償?shù)腇PGA實(shí)現(xiàn)方法。
    發(fā)表于 03-30 09:56 ?2572次閱讀
    基于距離徙<b class='flag-5'>動(dòng)</b>校正的彈速補(bǔ)償FPGA<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>方法</b>

    華為圖像服務(wù)場(chǎng)景動(dòng)Java示例代碼

    簡(jiǎn)介 場(chǎng)景動(dòng)服務(wù)提供基礎(chǔ)動(dòng)和高級(jí)動(dòng),幫助您實(shí)現(xiàn)
    發(fā)表于 03-23 11:06 ?0次下載

    OpenHarmony生態(tài)論壇:支付終端OpenHarmony的安全框架

    OpenHarmony生態(tài)論壇:支付終端OpenHarmony的安全框架
    的頭像 發(fā)表于 04-25 17:29 ?1408次閱讀
    <b class='flag-5'>OpenHarmony</b>生態(tài)論壇:支付終端<b class='flag-5'>在</b><b class='flag-5'>OpenHarmony</b><b class='flag-5'>上</b>的安全框架

    OpenHarmony生態(tài)論壇:UROVOOpenHarmony的規(guī)劃和實(shí)踐

    OpenHarmony生態(tài)論壇:UROVOOpenHarmony的規(guī)劃和實(shí)踐
    的頭像 發(fā)表于 04-25 17:33 ?1283次閱讀
    <b class='flag-5'>OpenHarmony</b>生態(tài)論壇:UROVO<b class='flag-5'>在</b><b class='flag-5'>OpenHarmony</b><b class='flag-5'>上</b>的規(guī)劃和實(shí)踐

    如何在OpenHarmony實(shí)現(xiàn)?翻頁(yè)動(dòng)呢?

    翻頁(yè)動(dòng)是應(yīng)用開發(fā)中常見的動(dòng)場(chǎng)景,常見的如書籍翻頁(yè)、日歷翻頁(yè)等。
    的頭像 發(fā)表于 06-11 15:15 ?596次閱讀
    如何在<b class='flag-5'>OpenHarmony</b><b class='flag-5'>上</b><b class='flag-5'>實(shí)現(xiàn)</b>?翻頁(yè)<b class='flag-5'>動(dòng)</b><b class='flag-5'>效</b>呢?

    OpenHarmony實(shí)戰(zhàn)開發(fā)-如何實(shí)現(xiàn)組件動(dòng)畫。

    ArkUI為組件提供了通用的屬性動(dòng)畫和轉(zhuǎn)場(chǎng)動(dòng)畫能力的同時(shí),還為一些組件提供了默認(rèn)的動(dòng)畫效果。例如,List的滑動(dòng)動(dòng),Button的點(diǎn)擊動(dòng),是組件自帶的默認(rèn)動(dòng)畫效果。組件默認(rèn)動(dòng)畫效
    的頭像 發(fā)表于 04-28 15:49 ?475次閱讀
    <b class='flag-5'>OpenHarmony</b>實(shí)戰(zhàn)開發(fā)-如何<b class='flag-5'>實(shí)現(xiàn)</b>組件動(dòng)畫。