精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲欧美卡通另类91av| 国产在线视频欧美一区| 久久色.com| 国产精品一区二区三| 国产真实乱在线更新| baoyu135国产精品免费| 色婷婷久久久久swag精品| 在线视频福利一区| 色香蕉在线视频| 日韩**一区毛片| 欧美放荡办公室videos4k| 9.1成人看片| 91麻豆精品国产综合久久久| 午夜精品久久一牛影视| 亚洲欧美日产图| 亚洲欧美另类综合| 男女激情视频一区| 97视频在线观看免费高清完整版在线观看| 久久成人激情视频| 免费观看性欧美大片无片| 一本久道中文字幕精品亚洲嫩| 亚洲一区二区在线免费观看| 丰满人妻av一区二区三区| 日韩精品每日更新| 不卡av电影院| 国产精品无码一区二区三区| 欧美影院精品| 欧洲视频一区二区| 男人日女人逼逼| 亚洲h片在线看| 国产精品美日韩| 久久综合福利| 蜜桃久久一区二区三区| 久久国产欧美日韩精品| 欧美在线日韩在线| 久久亚洲国产成人精品性色| 久久综合成人| 亚洲性av在线| v8888av| **爰片久久毛片| 777午夜精品视频在线播放| 欧美a在线视频| 波多野结衣中文在线| 中文字幕中文在线不卡住| 奇米视频888战线精品播放| 亚洲国产欧美另类| 国产精品一区二区x88av| 国产精品久久久久久中文字| 欧美一区二区三区四| 韩日成人在线| 欧美激情精品久久久| 我家有个日本女人| 亚洲色图二区| 操日韩av在线电影| 99久久婷婷国产综合| 欧美jizz| 久久精品国产亚洲7777| 91免费公开视频| 国产电影一区二区在线观看| 最近更新的2019中文字幕| 日本人亚洲人jjzzjjz| 精品国产一区二区三区香蕉沈先生 | 日韩欧美在线不卡| 91精产国品一二三产区别沈先生| 天天综合91| 欧美精品一卡二卡| 91av视频免费观看| 高清一区二区| 精品美女被调教视频大全网站| 日韩精品xxx| 一区二区网站| 亚洲精品美女久久久| 我和岳m愉情xxxⅹ视频| 精品久久久久久久久久久下田| 在线观看国产精品日韩av| 日本精品久久久久中文| 久久久久久久久久久妇女| 不卡毛片在线看| 国产精品自拍视频一区| 噜噜噜久久亚洲精品国产品小说| 国产精品福利在线观看网址| 91麻豆国产在线| 国产一区二区三区不卡在线观看 | 黄色一级片在线看| 天堂网在线最新版www中文网| 91久久人澡人人添人人爽欧美| 亚洲色图 在线视频| 国产精品白丝久久av网站| 精品国产一区久久| 加勒比一区二区| 91亚洲一区| 久久久久久久一区二区| 男人天堂视频网| 国产中文字幕精品| 国产一区二区免费电影| 成人在线免费视频| 一区二区三区日韩精品视频| 国产资源在线视频| 欧美xxxx性| 精品第一国产综合精品aⅴ| 欧美18—19性高清hd4k| 亚洲天天综合| 欧美主播福利视频| 99国产精品99| 久久免费偷拍视频| 韩国无码av片在线观看网站| 黑人精品一区| 日韩精品一区二区三区四区| 色欲AV无码精品一区二区久久| 欧美激情四色| 庆余年2免费日韩剧观看大牛| 国产精品欧美亚洲| 久久综合中文字幕| 亚洲日本精品国产第一区| 9999热视频在线观看| 欧美丰满嫩嫩电影| 中文字幕国产综合| 欧美精品日本| 国产精品亚洲自拍| 天天干天天干天天干| 成人免费一区二区三区在线观看| 国产超级av在线| 精品一级视频| 一本色道久久综合狠狠躁篇怎么玩| 久草视频免费在线| 黄网站免费久久| 日韩欧美亚洲日产国产| 少妇视频一区| 欧美videossexotv100| 亚洲少妇xxx| 天堂久久一区二区三区| 国产视频精品网| 在线视频国产区| 欧美裸体bbwbbwbbw| 蜜桃无码一区二区三区| 国产午夜久久| 好吊色欧美一区二区三区四区 | 国产精品视频无码| 日本一区二区三区四区在线视频| 欧美啪啪免费视频| 一区二区三区亚洲变态调教大结局| 久久精品免费电影| 在线视频 91| 欧美激情一区二区三区全黄 | 另类小说一区二区三区| 日本欧美精品久久久| 成人影院av| 亚洲欧美日韩中文视频| 久久亚洲天堂网| av成人免费在线观看| 青青草精品视频在线| 亚洲一级大片| 欧美激情亚洲国产| 粉嫩小泬无遮挡久久久久久| 亚洲国产一区二区三区| www.555国产精品免费| 欧美色一级片| 国产亚洲欧美一区二区三区| 国产亚洲成av人片在线观看| 亚洲福利视频专区| 久久午夜免费视频| 久久影院午夜论| 久久精品视频91| 区一区二视频| 国产自摸综合网| 超碰最新在线| 欧美精品一区二区高清在线观看| 久久草视频在线| 91在线一区二区| 精品久久久久久久无码| 日韩一区电影| 亚洲永久免费观看| av免费不卡| 亚洲人成电影在线播放| 亚洲一区二区天堂| 亚洲一区二区三区精品在线| 日本一区二区三区网站| 日韩影院在线观看| 日本丰满大乳奶| 美国成人xxx| 国产成人精品免费久久久久| 日本蜜桃在线观看| 精品久久久久久最新网址| www日韩精品| 亚洲国产成人私人影院tom| 91 视频免费观看| 日韩一级网站| 手机在线观看国产精品| 欧洲大片精品免费永久看nba| 992tv成人免费视频| av电影在线播放高清免费观看| 欧美一区二区高清| 中文字幕激情小说| 中文字幕日本乱码精品影院| 久久精品无码专区| 日本怡春院一区二区| 国产女教师bbwbbwbbw| 九一国产精品| 亚洲精品欧美日韩| 另类图片综合电影| 久久99热精品| 超碰在线影院| 亚洲国产99精品国自产| 亚洲天堂手机版| 精品欧美aⅴ在线网站| 国产喷水在线观看| 91啪九色porn原创视频在线观看| 伊人色在线观看| 香蕉av777xxx色综合一区| 日韩精品一区二区三区电影| 九色成人国产蝌蚪91| 91久久精品一区二区别| 亚洲四虎影院| 97视频人免费观看| free性欧美hd另类精品| 亚洲午夜小视频| 香蕉视频免费看| 日韩一二三区视频| 伊人影院中文字幕| 精品美女久久久久久免费| 日韩女优一区二区| 国产精品久久久久影院亚瑟 | 亚洲第一二区| 国产精品视频不卡| 欧美一级大片| 97国产suv精品一区二区62| 国产日产一区二区| 中文字幕日韩精品在线| 毛片免费在线播放| 亚洲精品videossex少妇| 国产www免费观看| 精品婷婷伊人一区三区三| 男人天堂2024| 狠狠爱在线视频一区| 三级黄色在线视频| 偷拍亚洲欧洲综合| 久久免费小视频| 亚洲精品老司机| 国产免费美女视频| 国产精品电影一区二区三区| 老头老太做爰xxx视频| 久久先锋影音av| 右手影院亚洲欧美| 99热精品国产| xfplay5566色资源网站| 国产ts人妖一区二区| 巨乳女教师的诱惑| 国产成人精品三级麻豆| 日日夜夜精品视频免费观看| 精品一区二区三区免费| 99re6在线观看| 久草热8精品视频在线观看| 亚洲国产高清av| 日本aⅴ免费视频一区二区三区| 狠狠热免费视频| 蜜桃91丨九色丨蝌蚪91桃色| 五月婷婷丁香色| 久久er99热精品一区二区| 亚洲欧美aaa| 韩国成人在线视频| 91香蕉视频免费看| 床上的激情91.| 亚洲欧美日韩偷拍| 26uuu色噜噜精品一区| 深爱五月激情网| 欧美国产日产图区| 久久嫩草捆绑紧缚| 亚洲精品免费一二三区| 久久综合成人网| 婷婷亚洲久悠悠色悠在线播放| 91av在线免费视频| 色综合激情五月| 亚洲综合网av| 日韩欧美国产一二三区| 少妇无码一区二区三区| 亚洲人在线视频| 日本电影全部在线观看网站视频| 欧美xxxx综合视频| 美女扒开腿让男人桶爽久久软| 日本一区二区在线免费播放| 久久精品嫩草影院| 成人看片视频| 国产一区二区区别| 一区二区三区四区视频在线观看 | 国产在线视频欧美一区| 国产精品久久国产三级国电话系列| 欧美国产不卡| 在线观看国产一区| 亚洲国产三级| www欧美激情| 成人午夜在线视频| 最近中文字幕在线mv视频在线| 中文字幕一区二区三区四区不卡 | 亚洲午夜精品网| 麻豆成人免费视频| 91精品久久久久久久91蜜桃| 少妇又色又爽又黄的视频| 中文字幕日韩电影| 黄色在线免费观看网站| 成人激情在线播放| 日韩高清一级| 国产a级片免费看| 香蕉久久国产| 日本少妇激三级做爰在线| www欧美成人18+| 青青草原在线免费观看视频| 色94色欧美sute亚洲13| 国产视频在线一区| 亚洲色图综合网| 9999精品成人免费毛片在线看 | 亚洲午夜无码久久久久| 精品国产乱子伦一区| 1区2区3区在线观看| 97超视频免费观看| 精品国产18久久久久久二百| 欧美日韩无遮挡| 影音先锋久久资源网| 国产探花在线看| 久久午夜国产精品| 亚洲激情视频一区| 91精品国产欧美一区二区成人 | 欧美成人免费在线观看视频| 狠狠v欧美v日韩v亚洲ⅴ| 欧美老熟妇乱大交xxxxx| 亚洲大尺度视频在线观看| 国产精品福利电影| 国产亚洲欧洲高清| 不卡一二三区| 国产尤物99| 影音先锋亚洲精品| gogo亚洲国模私拍人体| 一区二区中文视频| 中文字幕乱码中文字幕| 国产亚洲一区精品| 超碰国产一区| 欧美一区二区在线| 中文国产一区| 亚洲国产第一区| 亚洲福利视频三区| 蜜臀久久久久久999| 欧美激情一级欧美精品| 日韩精品成人| 黄黄视频在线观看| 国产原创一区二区三区| 久久噜噜色综合一区二区| 欧美精品在线视频| 国产美女av在线| 成人性生交大片免费观看嘿嘿视频| 精品国产乱码久久久| 一区二区xxx| 国产精品美女久久福利网站| 中文字幕在线观看高清| 中文字幕日韩欧美在线| 日韩毛片免费看| av动漫免费观看| 国产一区二区精品在线观看| 99精品久久久久| 精品欧美乱码久久久久久1区2区| 色婷婷av在线| 国产精品自拍首页| 亚洲一区图片| 免费看的黄色网| 欧美日韩国产首页| 超碰在线最新| 国产精品一区二区欧美黑人喷潮水 | 电影亚洲精品噜噜在线观看| 日本a级片久久久| 美日韩一级片在线观看| 欧美黄色aaa| 亚洲电影免费观看| 三级成人黄色影院| 中文字幕一区二区三区乱码| 国产精品一区免费视频| 精品无码久久久久久久| 日韩高清有码在线| 丁香婷婷久久| 欧美 日韩 国产精品| 成人av综合在线| 日本熟妇一区二区三区| 精品国产一区av| 日韩中文字幕视频网| 国产精品12345| 欧美国产精品专区| 亚洲AV无码精品国产| 欧洲日韩成人av| 91久久国产| 中文文字幕文字幕高清| 欧美视频在线一区| 国产桃色电影在线播放| 日本不卡在线播放| 国产精品一级二级三级| 中日韩精品视频在线观看| 一区二区三区美女xx视频| 日韩精品一区国产| 国产综合免费视频| 亚洲三级在线播放| 久草视频在线看| 91沈先生播放一区二区| 视频一区二区三区在线| 欧美成欧美va|