精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于ArkUI的水波紋動畫開發

系統 OpenHarmony
在日常應用場景中,水波紋的效果比較常見,例如數字鍵盤按鍵效果、聽歌識曲、附近搜索雷達動效等等,本文就以數字按鍵為例介紹水波紋動效的實現。

效果呈現

本例最終效果圖如下:


環境要求

本例基于以下環境開發,開發者也可以基于其他適配的版本進行開發:

  • IDE: DevEco Studio 3.1 Beta2
  • SDK: Ohos_sdk_public 3.2.11.9(API Version 9 Release)

實現思路

本實例涉及到的主要特性及其實現方案如下:

  • UI框架:使用Grid,GridItem等容器組件組建UI框架。
  • 按鈕渲染:通過自定義numBtn組件(含Column、Button、Stack、Text等關鍵組件以及visibility屬性),進行數字按鈕的渲染。
  • 按鈕狀態變化:設置狀態變量unPressed,控制按鈕的當前狀態,向Column組件添加onTouch事件,監聽按鈕的當前狀態。
  • 默認狀態為按鈕放開狀態(unPressed為true)。
  • 當按鈕按下時,更新按鈕的狀態(unPressed:true -> false)。
  • 當按鈕放開時,更新按鈕的狀態(unPressed:false -> true)。
  • 按鈕動畫展示:使用屬性動畫以及組件內轉場動畫繪制按鈕不同狀態下的動畫。
  • 當按鈕按下時,使用顯式動畫(animateTo)加載動畫:插入按下時的Row組件,同時加載水波的聚攏效果。
  • 當按鈕放開時,使用組件內轉場加載動畫:插入放開時的Row組件,同時加載水波的擴散效果。

開發步驟

針對實現思路中所提到的內容,具體關鍵開發步驟如下:

先通過Grid,GridItem等容器組件將UI框架搭建起來,在GuidItem中引用步驟2中的自定義數字按鈕numBtn構建出數字柵格。

具體代碼如下:

private numGrid: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, -1, 0, -1] 
  ...
    Column() {
      Grid() {
        ForEach(this.numGrid, (item: number, index: number) => {
          GridItem() {
            ...
          }
        }, item => item)
      }
      .columnsTemplate('1fr 1fr 1fr')
      .rowsTemplate('1fr 1fr 1fr 1fr')
      .columnsGap(10)
      .rowsGap(10)
      .width(330)
      .height(440)
    }.width('100%').height('100%')

通過Column、Button、Stack、Text等關鍵組件以及visibility屬性構建自定義數字按鈕numBtn。

具體代碼如下:

@Component
struct numBtn {
  ···
  build() {
    Column() {
        Button() {
            stack(){
                ...
                Text(`${this.item}`).fontSize(30)
            }
            ...
        }
        .backgroundColor('#ccc') 
        .type(ButtonType.Circle)
        .borderRadius(100)
        .width(100)
        .height(100)   
    }
    .visibility(this.item == -1 ? Visibility.Hidden : Visibility.Visible)
    .borderRadius(100)
  }
}

設置狀態變量unPressed,監聽當前數字按鈕的狀態,同時向Column組件添加onTouch事件,獲取并更新按鈕的當前狀態,從而可以根據監聽到的按鈕狀態加載對應的動畫效果。

具體代碼塊如下:

//狀態變量unPressed,用于監聽按鈕按下和放開的狀態
@State unPressed: boolean = true 
...
// 添加onTouch事件,監聽狀態
.onTouch((event: TouchEvent) => {
  // 當按鈕按下時,更新按鈕的狀態(unPressed:true -> false)
  if (event.type == TouchType.Down) {
    animateTo({ duration: 400 }, () => {
      this.unPressed = !this.unPressed
      this.currIndex = this.index
    })
  }
  // 當按鈕放開時,更新按鈕的狀態(unPressed:false -> true)
  if (event.type == TouchType.Up) {
    animateTo({ duration: 400 }, () => {
      this.unPressed = !this.unPressed
    })
  }
})

根據按鈕組件的按下/放開狀態,通過if-else語句選擇插入的Row組件,并隨之呈現不同的水波動畫效果(按下時水波聚攏,放開時水波擴散)。

具體代碼塊如下:

Stack() {
  Row() {
    // 判斷當前按鈕組件為放開狀態
    if (this.unPressed && this.currIndex == this.index) {
      // 插入Row組件,配置過渡效果
      Row()
        .customStyle()
        .backgroundColor('#fff')
          // 水波紋擴散動畫:從Row組件的中心點開始放大,scale{0,0}變更scale{1,1}(完整顯示)
        .transition({
          type: TransitionType.Insert,
          opacity: 0,
          scale: { x: 0, y: 0, centerY: '50%', centerX: '50%' }
        })
    }
    // 判斷當前按鈕組件為按下狀態
    else if (!this.unPressed && this.currIndex == this.index) {
      // 插入Row組件,配置過渡效果
      Row()
        .customStyle()
        .backgroundColor(this.btnColor)
        .scale(this.btnScale)
        .onAppear(() => {
          // 水波紋聚攏動畫:Row組件backgroundColor屬性變更(#ccc -> #fff),插入動畫過渡效果,scale{1,1}(完整顯示)變化為scale{0,0} 
          animateTo({ duration: 300,
            // 聚攏動畫播放完成后,需要銜接擴散動畫,Row組件backgroundColor屬性變更(#fff -> #ccc),插入動畫過渡效果,scale{0,0}變化為scale{1,1}(完整顯示)
            onFinish: () => {
              this.btnColor = '#ccc'
              this.btnScale = { x: 1, y: 1 }
            } },
            () => {
              this.btnColor = '#fff'
              this.btnScale = { x: 0, y: 0 }
            })
        })
    }
    // 其他狀態
    else {
      Row()
        .customStyle()
        .backgroundColor('#fff')
    }
  }
  .justifyContent(FlexAlign.Center)
  .alignItems(VerticalAlign.Center)
  .borderRadius(100)
  Text(`${this.item}`).fontSize(30)
}
.customStyle()

完整代碼

示例代碼如下:

@Entry
@Component
export default struct dragFire {
  private numGrid: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, -1, 0, -1]

  build() {
    Column() {
      Grid() {
        ForEach(this.numGrid, (item: number, index: number) => {
          GridItem() {
            numBtn({ item: item, index: index })
          }
        }, item => item)
      }
      .columnsTemplate('1fr 1fr 1fr')
      .rowsTemplate('1fr 1fr 1fr 1fr')
      .columnsGap(10)
      .rowsGap(10)
      .width(330)
      .height(440)
    }.width('100%').height('100%')
  }
}


@Component
struct numBtn {
  private currIndex: number = -1
  //狀態變量unPressed,用于控制按鈕的狀態
  @State unPressed: boolean = true
  @State btnColor: string = '#ccc'
  index: number
  item: number
  @State btnScale: {
    x: number,
    y: number
  } = { x: 1, y: 1 }

  @Styles customStyle(){
    .width('100%')
    .height('100%')
    .borderRadius(100)
  }

  build() {
    Column() {
      Button() {
        Stack() {
          Row() {
            // 判斷當前組件為放開狀態
            if (this.unPressed && this.currIndex == this.index) {
              // 插入Row組件,配置過渡效果
              Row()
                .customStyle()
                .backgroundColor('#fff')
                  // 水波紋擴散動畫:Row組件backgroundColor屬性變更(#fff -> #ccc),系統插入動畫過渡效果,從組建的中心點開始放大,scale{0,0}變更scale{1,1}
                .transition({
                  type: TransitionType.Insert,
                  opacity: 0,
                  scale: { x: 0, y: 0, centerY: '50%', centerX: '50%' }
                })
            }
            // 判斷當前組件為按下狀態
            else if (!this.unPressed && this.currIndex == this.index) {
              // 插入Row組件,配置過渡效果
              Row()
                .customStyle()
                .backgroundColor(this.btnColor)
                .scale(this.btnScale)
                .onAppear(() => {
                  // 水波紋聚攏動畫:Row組件backgroundColor屬性變更(#ccc -> #fff),插入動畫過渡效果,scale{1,1}變化為scale{0,0}
                  animateTo({ duration: 300,
                    // 聚攏動畫播放完成后,需要銜接擴散動畫,此時Row組件backgroundColor屬性變更(#fff -> #ccc),插入動畫過渡效果,scale{0,0}變化為scale{1,1}
                    onFinish: () => {
                      this.btnColor = '#ccc'
                      this.btnScale = { x: 1, y: 1 }
                    } },
                    () => {
                      this.btnColor = '#fff'
                      this.btnScale = { x: 0, y: 0 }
                    })
                })
            }
            // 其他狀態
            else {
              Row()
                .customStyle()
                .backgroundColor('#fff')
            }
          }
          .justifyContent(FlexAlign.Center)
          .alignItems(VerticalAlign.Center)
          .borderRadius(100)

          Text(`${this.item}`).fontSize(30)
        }
        .customStyle()
      }
      .stateEffect(false)
      .backgroundColor('#ccc')
      .type(ButtonType.Circle)
      .borderRadius(100)
      .width(100)
      .height(100)
    }
    .visibility(this.item == -1 ? Visibility.Hidden : Visibility.Visible)
    .borderRadius(100)
    // onTouch事件,監聽狀態
    .onTouch((event: TouchEvent) => {
      // 當按鈕按下時,更新按鈕的狀態(unPressed:true -> false)
      if (event.type == TouchType.Down) {
        animateTo({ duration: 400 }, () => {
          this.unPressed = !this.unPressed
          this.currIndex = this.index
        })
      }
      // 當按鈕放開時,更新按鈕的狀態(unPressed:false -> true)
      if (event.type == TouchType.Up) {
        animateTo({ duration: 400 }, () => {
          this.unPressed = !this.unPressed
        })
      }
    })
  }
}
責任編輯:姜華 來源: 鴻蒙開發者社區
相關推薦

2023-12-20 17:28:48

水波紋ArkUI動畫開發

2021-09-14 15:13:18

鴻蒙HarmonyOS應用

2023-10-30 08:35:50

水波紋效果vue

2024-06-13 08:15:00

2023-12-11 17:15:05

應用開發波紋進度條ArkUI

2022-09-05 15:22:27

ArkUIets

2021-09-02 10:00:42

鴻蒙HarmonyOS應用

2021-12-20 20:30:48

鴻蒙HarmonyOS應用

2022-10-19 15:12:05

ArkUI鴻蒙

2011-04-21 10:36:47

筆記本方正方正R110

2021-02-09 07:26:38

前端css技術熱點

2022-03-28 08:44:15

css3水波動畫

2022-07-20 15:24:47

ArkUI動畫效果項目開發

2022-09-16 15:34:32

CanvasArkUI

2024-01-11 15:54:55

eTS語言TypeScript應用開發

2023-10-17 13:49:36

ArkTS動畫開發

2024-07-09 08:43:29

2016-09-19 21:37:58

vue特效組件Web

2021-11-01 11:08:28

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

国产中文在线播放| 亚州精品国产精品乱码不99按摩| 久久综合成人| 日韩亚洲欧美高清| 日韩av新片网| 91sp网站在线观看入口| 国产超碰在线一区| 国产精品久久在线观看| 免费毛片在线播放免费 | 91精品国产综合久久久蜜臀图片| 国产毛片久久久久久国产毛片| 亚洲av成人无码网天堂| 久久99精品久久久久| 97精品国产97久久久久久春色| av永久免费观看| jazzjazz国产精品久久| 欧美图片一区二区三区| 性欧美大战久久久久久久| 97最新国自产拍视频在线完整在线看| 国产一区不卡精品| 国产精品成熟老女人| 日本三级2019| 一区二区电影| 中文欧美日本在线资源| 美国黄色一级视频| 亚洲在线资源| 欧美性极品少妇| 欧美日韩在线中文| sis001亚洲原创区| 亚洲免费资源在线播放| 日韩中文不卡| 欧美精品少妇| www.99精品| 国产传媒一区二区| 国产男女无套免费网站| 伊人久久久久久久久久久久久久| 看片一区二区| 色视频欧美一区二区三区| 男人添女人荫蒂免费视频| 国产在线69| 中文字幕在线一区免费| 色噜噜狠狠色综合网| 九色在线免费| 久久久噜噜噜久噜久久综合| 狠狠爱一区二区三区| 午夜老司机福利| 国产精品18久久久久久久久| 成人做爽爽免费视频| 一级黄色大片网站| 激情久久久久久久久久久久久久久久| 国产精品久久久久久久9999| 久久国产乱子伦精品| 免费日韩视频| 国产精品99免视看9| 黄色片视频免费| 日本欧美加勒比视频| 国产91在线播放精品91| 好看的av在线| 久久精品人人做人人爽电影蜜月| 欧美自拍视频在线| 激情视频网站在线观看| 视频在线观看91| 国产欧美精品一区二区| 91 中文字幕| 国产一区二区免费视频| dy888夜精品国产专区| 亚洲精品国产suv一区| 成人av网址在线| 免费久久99精品国产自| www.亚洲.com| 亚洲特级片在线| 日韩精品视频在线观看视频| 福利影院在线看| 色综合久久久网| 日本中文字幕二区| 久久在线观看| 日韩精品视频在线| 高清国产在线观看| 中文视频一区| 奇米一区二区三区四区久久| 日韩xxx视频| 精品一区二区免费视频| 国产高清在线一区| 久久经典视频| 亚洲免费观看高清在线观看| 日韩国产欧美亚洲| 欧美爱爱视频| 精品欧美久久久| 国产人妻大战黑人20p| 97久久夜色精品国产| 欧美精品电影在线| 中文字幕第2页| 成人性生交大合| 天堂精品视频| 第一av在线| 欧美亚洲免费在线一区| 免费不卡的av| 欧美电影免费观看高清| 国内精品中文字幕| 一区二区三区在线免费观看视频| 高清不卡一二三区| 亚洲国产精品久久久久婷婷老年| 欧美18hd| 色噜噜夜夜夜综合网| 乳色吐息在线观看| 欧美老女人另类| 久久男人av资源网站| 一女二男一黄一片| www成人在线观看| 日韩不卡视频一区二区| 成人开心激情| 亚洲精品www久久久| 精品国产视频一区二区三区| 另类图片国产| 国产精品亚洲综合| 老司机av在线免费看| 色一情一乱一乱一91av| 国产成人av片| 91精品国产乱码久久久久久久 | 日韩免费一级片| 美女视频免费一区| 热re99久久精品国产99热| 美女尤物在线视频| 欧美一区二区视频在线观看| 手机看片福利视频| 亚洲在线黄色| 国内精品视频在线播放| 久久香蕉av| 日韩一级黄色片| av在线免费播放网址| 日韩av网站免费在线| 麻豆蜜桃91| 牛牛精品一区二区| 亚洲国产日韩欧美在线动漫| 欧美被狂躁喷白浆精品| 国产一区二区不卡老阿姨| 亚洲毛片aa| 精品久久久网| 中文字幕欧美国内| 中文字幕一区二区在线视频| 久久免费的精品国产v∧| 国产精品无码av在线播放| 国产乱人伦丫前精品视频| 欧美高清激情视频| 亚洲av无码乱码国产精品久久| 一色屋精品亚洲香蕉网站| 天天色综合社区| 日韩理论在线| 成人免费午夜电影| 国产黄网站在线观看| 这里只有精品免费| 91麻豆精品国产91久久综合| 日本欧美在线看| 一区二区三区国| 成人噜噜噜噜| 欧美另类高清videos| www.国产欧美| 亚洲国产精品久久久男人的天堂| 91传媒理伦片在线观看| 亚洲欧洲午夜| 欧美日韩在线观看一区二区三区| 成人免费看黄| 中文字幕亚洲一区在线观看| 国产精品玖玖玖| 亚洲综合丝袜美腿| 中文成人无字幕乱码精品区| 新67194成人永久网站| 欧美高清视频一区| 超碰在线cao| 欧美xxxx在线观看| 国产www在线| 国产精品高潮呻吟久久| 日韩不卡的av| 国产午夜精品一区二区三区欧美| 欧洲精品久久| 国产精品毛片无码| 性色av一区二区三区免费 | 婷婷激情成人| 久久97精品久久久久久久不卡| 粉嫩小泬无遮挡久久久久久| 日韩人在线观看| 免费成年人视频在线观看| 成人一道本在线| 激情五月婷婷久久| 欧美涩涩视频| 欧洲精品亚洲精品| 日韩在线成人| 国产成人精品免费视频| 国内外激情在线| 日韩av影院在线观看| 中文字幕自拍偷拍| 图片区日韩欧美亚洲| 99国产精品免费| 成人18精品视频| 亚洲一级免费在线观看| 亚洲欧洲一区| 在线视频欧美一区| 少妇高潮一区二区三区| 91亚洲va在线va天堂va国| 日本在线啊啊| 欧美成人免费全部| 99中文字幕一区| 欧美精品一区二区在线观看| 一区二区视频免费观看| 欧美日韩一区二区三区在线免费观看 | 亚洲激情免费视频| 奇米色欧美一区二区三区| av一区二区三区四区电影| 欧美成人三级| 日韩美女在线观看| av影视在线看| 久久国产精品电影| av中文在线| 亚洲男女性事视频| 黄色av免费观看| 91精品久久久久久久久99蜜臂| 亚洲av无码不卡| 偷拍与自拍一区| 免费中文字幕在线观看| 国产精品久久久久久亚洲毛片| 亚洲第一成人网站| 9i在线看片成人免费| 91av免费观看| 激情综合一区二区三区| 自拍偷拍21p| 三级在线观看一区二区| 大陆极品少妇内射aaaaa| 国产精品地址| 好吊色视频988gao在线观看| 婷婷综合在线| 中文字幕日韩一区二区三区| 欧美日韩在线播放视频| 日本不卡久久| 国产99精品| 欧美最大成人综合网| 妖精视频一区二区三区免费观看| 国产精品视频一区二区三区经| 亚洲1区在线| 97se亚洲综合| 中文字幕一区二区三区四区久久 | 国产欧美一区二区三区米奇| 国产传媒一区二区三区| 一区二区三区亚洲变态调教大结局| 91在线中文字幕| 精品中文字幕一区二区三区| 91网在线免费观看| 激情不卡一区二区三区视频在线 | 亚洲免费福利一区| 久久精品日产第一区二区三区乱码| 国产福利一区二区精品秒拍| 欧美性生活一区| 91九色在线观看视频| 国产精品国码视频| 91免费版看片| 好吊日精品视频| 精品人妻少妇一区二区| 在线看片欧美| 激情深爱综合网| 久久精品盗摄| 三级在线免费看| 久久er精品视频| 国产资源中文字幕| 国产98色在线|日韩| 最新日本中文字幕| 97久久久精品综合88久久| 国产精品无码永久免费不卡| 久久综合九色综合97_久久久| 国产精品毛片一区二区| 中文字幕成人在线观看| 2025国产精品自拍| 亚洲综合色在线| 国产超碰人人爽人人做人人爱| 一本一道久久a久久精品| 中文字幕一区二区免费| 日韩欧美国产综合在线一区二区三区| 亚洲av无码乱码国产麻豆| 日韩av在线网址| 在线毛片网站| 欧美激情极品视频| 成人av观看| 91在线免费网站| 欧美男男freegayvideosroom| 日本一区二区三区四区在线观看| 日韩欧美123| 成人免费观看cn| 国产精品亚洲综合色区韩国| 久草青青在线观看| 久久99精品国产麻豆婷婷| 日本女人性视频| 91麻豆福利精品推荐| 成年人看的免费视频| 亚洲精品日韩一| 日韩精品在线观看免费| 欧美无砖专区一中文字| 亚洲成人一二三区| 亚洲色图13p| 日本色护士高潮视频在线观看| 欧美一级成年大片在线观看 | 97精品国产97久久久久久| 午夜av成人| 国产日产精品一区二区三区四区 | 成人手机在线播放| 日韩综合小视频| 亚洲美女精品视频| 国产精品久久夜| 国产香蕉视频在线| 91精品婷婷国产综合久久| 免费毛片在线| 欧美精品videos性欧美| 99国内精品久久久久| 欧美精品在线一区| 国自产拍偷拍福利精品免费一 | 成人精品免费视频| 免费一级suv好看的国产网站| 亚洲v日本v欧美v久久精品| 一级淫片免费看| 夜夜嗨av色综合久久久综合网| 牛牛电影国产一区二区| 国产欧美最新羞羞视频在线观看| 日韩高清三区| 无码 制服 丝袜 国产 另类| 国产一区在线观看视频| 欧美日韩999| 另类一区二区| 欧美成人dvd在线视频| 国产精品国码视频| 久久人人爽人人片| 国产精品萝li| 波多野结衣黄色网址| 亚洲激情视频在线播放| 色图在线观看| 亚洲aa中文字幕| 婷婷综合伊人| 手机免费av片| 久久久一区二区三区捆绑**| 懂色av.com| 欧美大片在线观看一区| av中文字幕一区二区三区| 国产精品91免费在线| 最新亚洲精品| 无码aⅴ精品一区二区三区浪潮 | 99成人在线视频| 国产福利影院在线观看| 欧美国产欧美综合| 日韩精品在线一区二区三区| 亚洲男人天堂2024| 久久r热视频| 免费试看一区| 日韩精品国产欧美| 日本黄色免费观看| 狠狠色噜噜狠狠狠狠97| 三级无遮挡在线观看| **欧美日韩vr在线| 美女精品一区最新中文字幕一区二区三区 | 免费人成黄页在线观看忧物| 国产成人精品免高潮费视频| av一区二区在线观看| 99国产精品久久久久久| 最近日韩中文字幕| www.看毛片| 国内精品小视频在线观看| 日韩极品少妇| 91色国产在线| 综合中文字幕亚洲| xxxwww在线观看| 欧美亚洲第一区| 色琪琪久久se色| 国产成人强伦免费视频网站| 亚洲精品视频免费看| 色哟哟中文字幕| 日本精品久久久久影院| 日韩理论电影院| 性生交大片免费看l| 污片在线观看一区二区| 黄色片在线免费看| 成人av在线亚洲| 亚洲狠狠婷婷| 成年人在线免费看片| 91麻豆精品国产91久久久久久久久 | 亚洲欧美日本在线观看| 国产v综合ⅴ日韩v欧美大片| 久久免费av| 亚洲图片欧美另类| 色av一区二区| а√资源新版在线天堂| 精品婷婷色一区二区三区蜜桃| 视频一区二区国产| 欧美日韩一级大片| 国产婷婷97碰碰久久人人蜜臀 | 动漫美女被爆操久久久| 国产精品亚洲综合久久| 91无套直看片红桃在线观看| 日韩精品一区二区三区中文不卡| 蜜桃视频动漫在线播放| 亚洲一区二区在线观| 99热精品国产| 国产精品无码久久av| 欧洲成人午夜免费大片| 中文字幕人成人乱码| 手机免费看av|