成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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-07-17 16:13:21

組件模塊開發的鴻蒙

2023-05-10 09:10:31

App組件化開發

2011-07-21 13:30:18

Apple Safari 瀏覽器

2023-08-08 14:31:42

輪播圖鴻蒙

2012-10-22 16:49:56

IBMdw

2024-01-18 15:24:06

Rust開發鴻蒙OH4.0

2024-05-14 08:33:57

Native API鴻蒙工具

2009-11-23 19:48:50

ibmdwJava

2010-05-03 11:05:26

Widget開發

2023-02-20 09:48:00

CSS浮動布局

2011-01-21 15:29:16

Thunderbird

2021-02-26 14:35:23

開發技能代碼

2021-02-27 10:58:25

基礎組件React

2022-12-26 11:24:28

鴻蒙Stage模型

2022-07-12 06:05:27

NutUI折疊面板組件開發

2022-02-14 14:14:02

鴻蒙數據可視化JS

2010-08-04 10:17:17

Android開發WebView組件

2023-08-24 16:45:16

應用開發父自定義組件

2022-11-07 15:40:22

數據轉碼應用應用開發

2022-09-16 15:34:32

CanvasArkUI
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品九九 | 国产一级片av | 久久一| 最新日韩在线 | 一级黄色片免费 | 一本一道久久a久久精品蜜桃 | 中文字幕国产视频 | 日本字幕在线观看 | 激情在线视频网站 | 每日在线更新av | 久久久视频在线 | 四虎影院在线观看av | 亚洲精品粉嫩美女一区 | 免费视频二区 | 国产在线中文字幕 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 国产一区二区三区久久久久久久久 | 视频一区二区在线观看 | 黄色男女网站 | 欧美在线日韩 | 成人精品国产一区二区4080 | 精品国产一区二区三区性色 | 国产精品久久久久久吹潮日韩动画 | a网站在线观看 | 国产一区二区三区四区在线观看 | 午夜电影福利 | 国产美女一区二区 | 亚洲精品2区 | 一区二区三区视频 | 亚洲精品高清视频在线观看 | 影音先锋欧美资源 | 日韩精品在线网站 | 国产在线观看一区二区三区 | 黄页网址在线观看 | 亚洲三级在线观看 | 国产精品成人一区二区三区吃奶 | 久久久蜜桃一区二区人 | 伊人av在线播放 | 亚洲精品2区| 国产精品毛片一区二区在线看 | 中文字幕综合在线 |