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

OpenHarmony折疊展開動效開發—使用List組件中的Groupcollapse和Groupexpand

系統 OpenHarmony
創建折疊時的文本組件,根據List組件中的Groupcollapse和Groupexpand事件自定義一個CollapseAndExpand組件,父組件通過維護Flag和OnFlagChange來控制折疊/展開的動效,設置動效所需的參數,添加邏輯來展示展開后的文本。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

折疊展開動效

場景介紹

由于目前移動端需要展示的內容越來越多,但是移動端的空間彌足珍貴,在有限的空間內不可能羅列展示全部種類內容,因此折疊/展開功能就可以解決當前問題,本文就介紹下如何使用ArkTS來實現折疊展開動效。

效果呈現

折疊展開動效定義:點擊展開按鈕,下拉動畫展示內容,點擊折疊按鈕,折疊動畫折疊內容。

本例最終效果如下:

運行環境

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

  • IDE: DevEco Studio 3.1 Release。
  • SDK: Ohos_sdk_public 3.2.12.5(API Version 9 Release)。

實現思路

創建折疊時的文本組件,根據List組件中的groupcollapse和groupexpand事件自定義一個CollapseAndExpand組件,父組件通過維護flag和onFlagChange來控制折疊/展開的動效,設置動效所需的參數,添加邏輯來展示展開后的文本。

開發步驟

創建自定義接口IRowItem。
具體代碼如下:

interface IRowItem {
    id?: number;
    title?: string;
    name1?: string;
    name2?: string;
    name3?: string;
    flag?: boolean;
    type?: string;
    onFlagChange?: () => void;
}

創建自定義組件CollapseAndExpandDemo,根據自定義接口IRowItem添加內容,創建UI展示文本。
具體代碼如下:

@Entry
@Component{
    ...
    build() {
        Column() {
            Row() {
                Image($r("app.media.ic_public_back"))
                .width(20)
                .height(20)
                Text('周免英雄')
                .fontSize(18)
                .fontWeight(FontWeight.Bold)
                .margin({ left: 10 })
            }
            .width('100%')
            .margin({ bottom: 30 })
    
            Column() {
                RowItem({ props: { title: 'AAAAA', name1: 'BBBBB', name2: 'CCCCC', name3: '武器大師' } })
                // 文本折疊時,type為DOWN
                RowItem({ props: { name1: 'DDDDD', name2: 'EEEEE', name3: 'FFFFF', type: 'DOWN', onFlagChange: this.onFlagChange } })  

                //被折疊的文本內容
                ...  

                RowItem({ props: { title: '商城', name1: '免費', name2: '特價', name3: 'VIP' } })
                RowItem({ props: { title: '分類', name1: '按職業', name2: '按位置', name3: '按城市' } })
            }
            .width('100%')
}

被折疊文本信息。
具體代碼如下:

CollapseAndExpand({
    items: [
        { id: 0, name1: 'GGGGG', name2: 'HHHHH', name3: 'JJJJJ' },
        { id: 1, name1: 'KKKKK', name2: 'LLLLL', name3: 'MMMMM' },
        { id: 2, name1: 'NNNNN', name2: 'OOOOO', name3: 'PPPPP' },
        // 文本展開時,type為UP
        { id: 3, name1: 'QQQQQ', name2: 'RRRRR', name3: 'SSSSS', type: 'UP', onFlagChange: this.onFlagChange }
    ],
})

將步驟2創建的文本進行渲染。
具體如下:

build() {
    Flex() {
      Text(this.props.title)
        .fontSize(14)
        .fontWeight(FontWeight.Bold)
        .layoutWeight(1)
        .fontColor(Color.Red)
        .margin({ right: 10 })
      Flex({ alignItems: ItemAlign.Center }) {
        Text(this.props.name1).fontSize(14).margin({ right: 10 })
        Text(this.props.name2).fontSize(14).margin({ right: 10 })
        Text(this.props.name3).fontSize(14).margin({ right: 10 })
        ...
      }
    }
  }

創建自定義組件CollapseAndExpand。
根據自定義組件說明動效,@Provide負責數據更新,并且觸發渲染;@Consume在感知數據更新后,重新渲染。
具體代碼如下:

@Entry
@Component
struct CollapseAndExpandDemo {
  @Provide("flag") flag: boolean = false
  private onFlagChange = () => {
    animateTo({   
        duration: 650,
        curve: Curve.Smooth
    }, () => {
        this.flag = !this.flag;
    })
  } 

  ...

@Component
struct CollapseAndExpand {
    private items: IRowItem[] = [];
    @Consume("flag") flag: boolean;
    
    build() {
        Column() {
            ForEach(this.items, (item: IRowItem) => {
                RowItem({ props: item })
            }, (item: IRowItem) => item.id.toString())
        }
        .width('100%')
        .clip(true)
        .height(this.flag ? 130 : 0)
    }
}

根據步驟4最終的flag以及props的type值,判斷折疊展開的效果實現。
具體代碼如下:

build() {
    ...
    // 當文本折疊(flag為false且type為down)時,展示展開按鈕
    // 當文本展開(flag為true且type為up)時,展示折疊按鈕
    if (!this.flag && this.props.type === 'DOWN' || this.flag && this.props.type === 'UP') {
    Image($r("app.media.icon"))
        .width(16)
        .height(16)
        .objectFit(ImageFit.Contain)
        .rotate({ angle: !this.flag && this.props.type === 'DOWN' ? 0 : 180 })
        // 點擊按鈕后旋轉180°,展示折疊按鈕
        .onClick(() =>
        this.props.onFlagChange()
        )
        .transition({ type: TransitionType.All, opacity: 0 })
    }
}

完整代碼

示例代碼如下:

interface IRowItem {
    id?: number;
    title?: string;
    name1?: string;
    name2?: string;
    name3?: string;
    flag?: boolean;
    type?: string;
    onFlagChange?: () => void;
}

@Entry
@Component
struct CollapseAndExpandDemo {
    @Provide("flag") flag: boolean = false
    private onFlagChange = () => {
        animateTo({  
            duration: 650,
            curve: Curve.Smooth
            }, () => {
                this.flag = !this.flag;
                })
    }

    build() {
        Column() {
            Row() {
                Image($r("app.media.ic_public_back")).width(20).height(20)
                Text('周免英雄')
                .fontSize(18)
                .fontWeight(FontWeight.Bold)
                .margin({ left: 10 })
            }
            .width('100%')
            .margin({ bottom: 30 })

            Column() {
                RowItem({ 
                    props: { title: '英雄', name1: 'AAAAA', name2: 'BBBBB', name3: 'CCCCC' } })
                RowItem({ 
                    props: { 
                        name1: 'DDDDD', 
                        name2: 'EEEEE', 
                        name3: 'FFFFF', 
                        // 文本折疊時,type為DOWN
                        type: 'DOWN', 
                        onFlagChange: this.onFlagChange  
                    }
                })
                // 直接調用折疊展開組件
                CollapseAndExpand({
                    items: [
                        { id: 0, name1: 'GGGGG', name2: 'HHHHH', name3: 'JJJJJ' },
                        { id: 1, name1: 'KKKKK', name2: 'LLLLL', name3: 'MMMMM' },
                        { id: 2, name1: 'NNNNN', name2: 'OOOOO', name3: 'PPPPP' },
                        { id: 3, 
                        name1: 'QQQQQ', 
                        name2: 'RRRRR', 
                        name3: 'SSSSS', 
                        // 文本折疊時,type為UP
                        type: 'UP', 
                        onFlagChange: this.onFlagChange }  
                    ],
                })

                RowItem({ props: { title: '商城', name1: '免費', name2: '特價', name3: 'VIP' } })
                RowItem({ props: { title: '分類', name1: '按職業', name2: '按位置', name3: '按城市' } })
            }
            .width('100%')

        }
        .height('100%')
        .padding({ top: 30, right: 30, left: 30 })
  }
}

@Component
struct RowItem {
    private props: IRowItem;
    @Consume("flag") flag: boolean

    build() {
        Flex() {
            Text(this.props.title)
            .fontSize(14)
            .fontWeight(FontWeight.Bold)
            .layoutWeight(1)
            .fontColor(Color.Red)
            .margin({ right: 10 })
            Flex({ alignItems: ItemAlign.Center }) {
                Text(this.props.name1).fontSize(14).margin({ right: 10 })
                Text(this.props.name2).fontSize(14).margin({ right: 10 })
                Text(this.props.name3).fontSize(14).margin({ right: 10 })

                // 當文本折疊(flag為false且type為down)時,展示展開按鈕
                // 當文本展開(flag為true且type為up)時,展示折疊按鈕
                if (!this.flag && this.props.type === 'DOWN' || this.flag && this.props.type === 'UP') {
                    Image($r("app.media.ic_public_arrow_down_0"))
                    .width(16)
                    .height(16)
                    .objectFit(ImageFit.Contain)
                    .rotate({ angle: !this.flag && this.props.type === 'DOWN' ? 0 : 180 }) 
                    // 點擊展開按鈕后旋轉180°,展示折疊按鈕
                    .onClick(() => this.props.onFlagChange())
                    .transition({ type: TransitionType.All, opacity: 0 })
                }
            }
            .layoutWeight(3)
        }
        .width('100%')
        .height(16)
        .margin({ top: 15 })
    }
}

@Component
struct CollapseAndExpand {
    private items: IRowItem[] = [];
    @Consume("flag") flag: boolean;

    build() {
        Column() {
            ForEach(this.items, (item: IRowItem) => {
                RowItem({ props: item })
            }, (item: IRowItem) => item.id.toString())
        }
        .width('100%')
        .clip(true)
        .height(this.flag ? 130 : 0)
    }
}

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2023-08-08 14:31:42

輪播圖鴻蒙

2023-05-10 09:10:31

App組件化開發

2023-07-17 16:13:21

組件模塊開發的鴻蒙

2011-07-21 13:30:18

Apple Safari 瀏覽器

2023-08-24 16:45:16

應用開發父自定義組件

2009-11-23 19:48:50

ibmdwJava

2022-07-12 06:05:27

NutUI折疊面板組件開發

2021-02-27 10:58:25

基礎組件React

2021-02-26 14:35:23

開發技能代碼

2023-02-20 09:48:00

CSS浮動布局

2012-10-22 16:49:56

IBMdw

2011-01-21 15:29:16

Thunderbird

2022-11-07 15:40:22

數據轉碼應用應用開發

2010-05-03 11:05:26

Widget開發

2024-05-14 08:33:57

Native API鴻蒙工具

2024-01-18 15:24:06

Rust開發鴻蒙OH4.0

2022-08-17 16:38:46

WLAN接口組件功能

2023-11-06 13:17:53

ServiceAndroid

2022-12-26 11:24:28

鴻蒙Stage模型

2023-06-05 15:00:13

書籍翻頁動效鴻蒙
點贊
收藏

51CTO技術棧公眾號

日韩高清不卡一区二区| 国产区精品区| 午夜不卡av免费| 久久久久久精| 亚洲熟妇无码久久精品| 午夜欧美精品久久久久久久| 亚洲国产古装精品网站| 中文字幕乱码人妻综合二区三区 | 永久免费网站视频在线观看| 神马久久久久久久久久| 男女视频一区二区| 久久91亚洲人成电影网站| 成人午夜福利一区二区| 日韩精品视频在线看| 欧美性极品少妇精品网站| 成年人黄色在线观看| 视频福利在线| 国产成人午夜视频| 国产精品亚洲激情| 日韩欧美亚洲视频| 日韩欧美伦理| 亚洲另类xxxx| 动漫美女无遮挡免费| 欧美亚洲综合视频| 色综合婷婷久久| 97超碰国产精品| 午夜激情在线观看| 91亚洲午夜精品久久久久久| 成人性生交大片免费看视频直播 | 中文字幕这里只有精品| 一级中文字幕一区二区| 一区二区在线中文字幕电影视频| 亚洲区小说区图片区| 国产成人一区二区精品非洲| 国产伦精品一区二区三区精品视频| 国产女同在线观看| 欧美激情第8页| 日韩中文有码在线视频| 欲求不满的岳中文字幕| 99久久香蕉| 欧美一区二区三区成人| 亚洲一级片网站| 超碰一区二区| 一本一本大道香蕉久在线精品| 黄色一级片黄色| 手机在线免费观看av| 亚洲私人影院在线观看| 亚洲一区二区三区加勒比| 久色视频在线| 国产亚洲一区字幕| 欧美日韩一区二区视频在线| 欧美日韩国产综合视频| 久久久亚洲午夜电影| 女同一区二区| 欧美男男激情freegay| 91麻豆精品视频| 精品欧美一区二区三区久久久 | 久久精品国产成人av| 精品电影一区| 97激碰免费视频| 久久成人在线观看| 黄色成人av网站| 亚洲**2019国产| 国产亚洲欧美在线精品| 久久综合九色| 国产精品久久久久9999| 中文字幕一级片| 精品一区二区免费在线观看| 91精品视频大全| 国产高清在线观看视频| 国产99久久久国产精品免费看| 97人人模人人爽人人少妇| 精品人妻无码一区二区| 丁香六月久久综合狠狠色| 国产不卡一区二区在线观看 | 91免费看`日韩一区二区| 精品一卡二卡三卡四卡日本乱码| 三级视频在线| 国产欧美精品国产国产专区| 亚洲一区在线免费| 宅男在线观看免费高清网站| 亚洲国产精品视频| 日本在线观看a| 久久女人天堂| 日韩欧美一二区| 欧美深性狂猛ⅹxxx深喉| 激情五月综合网| 久久大大胆人体| 国产精品成人久久| 久久午夜精品| 亚洲综合日韩中文字幕v在线| 囯产精品久久久久久| 久久先锋资源网| 手机福利在线视频| 中国色在线日|韩| 538在线一区二区精品国产| 欧美日韩一区二区区别是什么| 欧美巨大xxxx| 精品国产一区二区三区四区在线观看 | 又骚又黄的视频| 成人性生交大片免费看视频在线 | 超碰免费97在线观看| 亚洲日本护士毛茸茸| 黄色网页免费在线观看| 亚洲影视资源| 国产丝袜精品视频| 91嫩草|国产丨精品入口| 亚洲一区日本| 97伦理在线四区| 日韩免费网站| 日韩欧美国产免费播放| 天天爽夜夜爽视频| 国产精品探花在线观看| 久久久久国色av免费观看性色 | 国产在线观看成人| 捆绑调教一区二区三区| 久久久精品动漫| 在线观看a级片| 欧美日韩视频在线第一区| 久久久久国产精品无码免费看| av一区二区高清| 欧美在线激情视频| 亚洲av综合色区无码一区爱av| 久久精品一区四区| 高清欧美精品xxxxx| gogo大尺度成人免费视频| 一区二区国产精品视频| 国产又粗又爽视频| 99久久婷婷国产精品综合| 操bbb操bbb| 四虎影视精品永久在线观看| 国产亚洲xxx| 国产农村妇女aaaaa视频| 成人免费视频国产在线观看| 在线视频一二三区| 欧美韩国日本| 日韩在线视频免费观看高清中文| 男操女视频网站| 97se狠狠狠综合亚洲狠狠| 国产精品久久久久9999爆乳| 欧美.com| 欧美黑人国产人伦爽爽爽| 国产又黄又爽视频| 中文字幕亚洲在| 天堂中文av在线| 久久国产精品成人免费观看的软件| 秋霞成人午夜鲁丝一区二区三区| 亚洲人成色777777精品音频| 精品女厕一区二区三区| 亚洲av永久无码精品| 亚洲午夜极品| 国产欧美日韩一区| 多野结衣av一区| 亚洲精品美女久久久| 制服.丝袜.亚洲.中文.综合懂色| 91丨porny丨蝌蚪视频| 国产一级爱c视频| 欧美大奶一区二区| 欧美壮男野外gaytube| 男女视频在线观看免费| 色偷偷88欧美精品久久久| 四虎影成人精品a片| 日韩电影在线一区二区三区| 亚洲一区三区| 日韩欧美中文在线观看| 欧美精品在线免费| 人妻无码中文字幕| 欧美日韩国产一中文字不卡| 丰满少妇高潮一区二区| 奇米色777欧美一区二区| 日本不卡一区二区三区四区| 日本精品在线播放| 欧美国产视频日韩| 日韩亚洲视频在线观看| 欧美日韩免费不卡视频一区二区三区 | 高潮白浆女日韩av免费看| 爱爱免费小视频| 麻豆freexxxx性91精品| 免费cad大片在线观看| 久久夜色电影| 国产精品久久久久久久午夜| 国产福利在线播放麻豆| 亚洲成av人片在线观看香蕉| 69亚洲精品久久久蜜桃小说| 中文字幕永久在线不卡| 在线xxxxx| 青青草97国产精品免费观看无弹窗版 | 国产精品视频yy9099| h片在线免费| 亚洲精品久久久一区二区三区| 看黄色一级大片| 亚洲一区日韩精品中文字幕| 免费观看av网站| 国产麻豆精品视频| av动漫在线观看| 亚洲乱码免费伦视频| 久久精品国产综合精品| www.久久爱.com| 2020国产精品视频| 黄色网址在线免费| 亚洲精品影视在线观看| 国产精品久久久久精| 欧美视频在线观看免费| 久久r这里只有精品| 国产亚洲精久久久久久| 人妻 日韩 欧美 综合 制服| 麻豆高清免费国产一区| 成年人网站免费视频| 国产精品成人a在线观看| 欧美xxxx黑人又粗又长精品| 精品国产欧美| 国产精品日韩专区| 超碰资源在线| 欧美另类xxx| av影片在线看| 亚洲精品一区二三区不卡| 国产夫妻性生活视频| 欧美在线免费观看亚洲| 在线观看 中文字幕| 亚洲精品国产一区二区三区四区在线| 日本二区在线观看| av不卡免费电影| 自拍视频第一页| 激情伊人五月天久久综合| 韩国日本在线视频| 国产亚洲毛片| 欧美日韩一道本| 亚洲网址在线| 亚洲色成人www永久在线观看 | 国产精品视频看| 欧美熟妇一区二区| 99re这里只有精品首页| 91超薄肉色丝袜交足高跟凉鞋| 国产一区不卡视频| 一级黄色录像在线观看| 秋霞av亚洲一区二区三| 激情婷婷综合网| 久久美女性网| 成人午夜视频免费在线观看| 亚洲一区二区免费看| 人妻久久久一区二区三区| 极品中文字幕一区| www.avtt| aa国产精品| 92看片淫黄大片一级| 久久av最新网址| 国产日韩一区二区在线观看| 久久久亚洲人| 欧美黑人又粗又大又爽免费| 9国产精品视频| 国产极品美女高潮无套久久久| 亚洲综合丁香| 国产又粗又长又大的视频| 老**午夜毛片一区二区三区| 男人天堂成人在线| 免费观看在线色综合| 亚洲天堂2018av| 国内国产精品久久| 日本人妻一区二区三区| 成人精品鲁一区一区二区| 国产精品亚洲一区二区无码| 99国产麻豆精品| 公侵犯人妻一区二区三区| 国产三级久久久| 999久久久国产| 亚洲精品老司机| 丰满少妇乱子伦精品看片| 色综合久久久久综合99| 中文字幕在线观看精品| 91精品国产综合久久婷婷香蕉| 精品人妻一区二区三区换脸明星| 精品国产91久久久久久久妲己| 亚洲日本国产精品| 中文字幕欧美精品在线| 日本无删减在线| 欧洲成人免费aa| 欧美黄页免费| 国严精品久久久久久亚洲影视| 国产精品视频一区二区三区四蜜臂| 亚洲精品在线免费看| 欧美精品福利| 黄色片一级视频| 国精产品一区一区三区mba桃花 | 欧美激情一区二区三区全黄| 日韩成人短视频| 欧美视频在线观看免费| 国产精品亚洲lv粉色| 亚洲国产成人精品女人久久久| 成人福利在线| 色在人av网站天堂精品| 日本美女一区| 91观看网站| 精品一区av| 久操手机在线视频| 日本亚洲欧美天堂免费| 2025中文字幕| 国产精品丝袜在线| 国产网站在线看| 欧美另类高清zo欧美| 婷婷丁香花五月天| 久久久国产成人精品| 黑人巨大精品| 俄罗斯精品一区二区三区| 色综合蜜月久久综合网| 日本www在线视频| 国产一区二区三区av电影| 精品人妻无码一区二区三区换脸| 亚洲精品国产品国语在线app| 中文字幕xxxx| 亚洲激情久久久| 18av在线视频| 国产欧美久久一区二区| 亚洲人亚洲人色久| 久艹在线免费观看| 国产综合一区二区| 亚洲成人网在线播放| 亚洲综合免费观看高清在线观看| 中文字幕乱码视频| 亚洲精品日韩丝袜精品| 久草在线视频福利| 亚洲va欧美va国产综合剧情| 欧美日韩国产高清电影| 美女av免费在线观看| 成人免费毛片aaaaa**| 精品国产欧美日韩不卡在线观看| 欧美色图第一页| 美女做暖暖视频免费在线观看全部网址91 | 亚洲欧美综合另类中字| av今日在线| 成人18视频| 欧美国产免费| 老女人性生活视频| 亚洲人成网站精品片在线观看| 11024精品一区二区三区日韩| 国产小视频国产精品| 午夜欧美巨大性欧美巨大| 久久久久久久有限公司| 999亚洲国产精| 中文字幕第3页| 五月婷婷综合网| 亚洲 另类 春色 国产| 97激碰免费视频| 日韩大片在线免费观看| www.99热这里只有精品| av在线播放一区二区三区| 日韩毛片在线播放| 亚洲高清久久网| 黄视频网站在线观看| 久久66热这里只有精品| 国产精品色网| 欧美做受xxxxxⅹ性视频| 色婷婷精品久久二区二区蜜臂av| 你懂的免费在线观看| 日韩美女中文字幕| 国产91精品对白在线播放| 国产视频一区二区三区在线播放| 久久免费看少妇高潮| 国产性生活视频| 中文字幕欧美视频在线| 国产成人免费av一区二区午夜| 中文字幕不卡每日更新1区2区| 国产精品综合av一区二区国产馆| 亚洲综合视频网站| 精品国产污污免费网站入口| 成人免费观看在线观看| 欧洲亚洲一区二区| 久久99精品国产麻豆婷婷| 日韩精品一区二区亚洲av性色| 日韩久久免费av| 福利影院在线看| 日韩三级电影免费观看| 激情综合色综合久久综合| 国产网址在线观看| 国产一区二区三区在线观看网站| 日韩一区二区三免费高清在线观看| 97精品国产97久久久久久粉红| 成人一区二区三区视频在线观看| 国产精品一区二区三区四| 在线观看视频亚洲| 久久久久亚洲精品中文字幕| a级黄色一级片| 中文字幕中文字幕在线一区 | 久久精品一级爱片| 亚洲最大成人在线视频| 欧美激情综合亚洲一二区| 在线观看欧美理论a影院| 在线黄色免费看| 婷婷开心激情综合| freemovies性欧美| 国产精品yjizz| 蜜桃视频在线一区| 国产稀缺真实呦乱在线| 中文字幕av一区| 久久365资源| 亚洲第一区第二区第三区| 欧美日韩在线视频观看| 成码无人av片在线观看网站| 免费久久99精品国产自| 国产在线精品国自产拍免费| 免费视频久久久|