#HarmonyOS 鸿蒙Next挑战赛第四期# ArkUI声明式编程仿朋友圈九宫格图片和大图预览

发布于 1周前 作者 songsunli 来自 鸿蒙OS

#HarmonyOS 鸿蒙Next挑战赛第四期# ArkUI声明式编程仿朋友圈九宫格图片和大图预览

HarmonyOS挑战赛第四期# ArkUI声明式编程:仿朋友圈图片九宫格和图片预览

项目介绍

  • 项目名称:ArkUI声明式编程:仿朋友圈图片九宫格和图片预览
  • 功能:仿朋友圈列表展示,九宫格小图图片展示,点击图片进行图片预览,图片左右滑动切换。
  • 开发版本:sdk7,DevEco Studio3.0 Beta1

效果演示

arkuifriends.gif

开发简介

通过ArkUI声明式编程,实现仿朋友圈列表展示,九宫格小图图片展示,点击图片进行图片预览,图片左右滑动切换。

主要功能和知识点

主要功能:

  1. 列表展示
  2. 九宫格图片展示
  3. 图片预览

主要知识点:

  • 九宫格列表和选择图片列表:网格容器组件(Grid)
  • 浏览大图切换页面:滑动容器组件(Swiper)
  • 循环渲染迭代数组:渲染组件(ForEach)
  • 基础的组件:图片显示(Image) 文本显示(Text)
  • 布局容器组件:Column,Row,Stack

代码解析

1. 朋友圈列表展示

列表使用List组件实现多数据列表展示。

List({ initialIndex: 0 }) {
    ForEach(this.listItems, item => {
        ListItem() {
            Row() {
                Column() {
                    Image(item.bigImg)
                        .width(50)
                        .height(50)
                        .borderRadius(30)
                        .margin(5)
                        .onClick(() => {})
                    Blank()
                }
                .height("100%")
                Column() {
                    Text(item.name)
                        .fontSize(16)
                        .margin({ left: 0})
                        .width("100%")
                    Row() {
                        Text(item.content)
                            .fontSize(14)
                            .margin({ top: 10 })
                            .fontColor(Color.Grey)
                            .width("80%")
                            .textAlign(TextAlign.Start)
                        Blank()
                    }
                    Column() {
                        Grid() {
                            ForEach(this.imageDataArray, item => {
                                GridItem() {
                                    Image(item.smallImg).width(50).height(50)
                                }
                                .sharedTransition("0", { duration: 100, curve: Curve.Linear })
                                .onClick(() => {
                                    console.log("item.id===" + item.id)
                                    router.push({
                                        uri: 'pages/imageflige',
                                        params: {
                                            imageIndex: item.id, // 当前图片位置
                                        }
                                    })
                                })
                            }, item => item.name)
                        }
                        .width(155)
                        .columnsTemplate('1fr 1fr 1fr')
                        .rowsGap(2)
                        .columnsGap(2)
                    }
                    .width('100%')
                    .height(200)
                    .alignItems(HorizontalAlign.Start)
                    .margin({ top: 10 })
                }
                .height("100%")
            }
            .height("100%")
        }
        .height(250)
        .margin({ top: 10 })
    }, item => item.name)
}

2. 九宫格展示

主要是网格容器Grid组件和渲染组件ForEach。

Column() {
    Grid() {
        ForEach(this.imageDataArray, item => {
            GridItem() {
                Image(item.smallImg).width(50).height(50)
            }
            .sharedTransition("0", { duration: 100, curve: Curve.Linear })
            .onClick(() => {
                console.log("item.id===" + item.id)
                router.push({
                    uri: 'pages/imageflige',
                    params: {
                        imageIndex: item.id, // 当前图片位置
                    }
                })
            })
        }, item => item.name)
    }
    .width(155)
    .columnsTemplate('1fr 1fr 1fr')
    .rowsGap(2)
    .columnsGap(2)
}
.width('100%')
.height(200)
.alignItems(HorizontalAlign.Start)
.margin({ top: 10 })

3. 大图预览

使用滑动容器组件Swiper,通过传递点击的当前下标定位到指定位置。

import router from '@system.router';

@Componentstruct
Imageflige {
    @State private listPicture: Array<Resource> = [
        $r("app.media.food1"), $r("app.media.food2"), $r("app.media.food3"),
        $r("app.media.food4"), $r("app.media.food5"), $r("app.media.food1"),
        $r("app.media.food2"), $r("app.media.food3"), $r("app.media.food4")
    ]
    @State imageIndex: number = 0

    build() {
        Column() {
            Stack({ alignContent: Alignment.Top }) {
                // 切换页面
                Swiper() {
                    ForEach(this.listPicture, item => {
                        // 图片
                        Image(item)
                            .width('100%')
                            .height('100%')
                            .objectFit(ImageFit.Contain) //缩放类型
                    }, item => item.toString())
                }
                .width('100%')
                .height('100%')
                .index(this.imageIndex) // 设置当前索引
                .indicator(true) // 不显示指示器
                .loop(true) // 关闭循环
                .sharedTransition("0", { duration: 100, curve: Curve.Linear })
                .onChange((index: number) => { // 索引变化监听
                    // 更新索引值
                    this.imageIndex = index
                })
                Image($r("app.media.back"))
                    .width(35)
                    .height(35)
                    .margin(10)
                    .backgroundColor(Color.White)
                    .onClick(() => {
                        router.back()
                    })
            }
            .height("100%")
            .width("100%")
            .alignContent(Alignment.TopStart)
        }
    }

    private aboutToAppear() {
        this.imageIndex = router.getParams().imageIndex
    }
}

项目结构说明

project.png

项目地址

https://gitee.com/dot_happydz_admin/ark-ui.git(需要登录才能看到演示图)

结尾

声明式UI开发真快,代码量少,鸿蒙真实太棒了。


更多关于#HarmonyOS 鸿蒙Next挑战赛第四期# ArkUI声明式编程仿朋友圈九宫格图片和大图预览的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

缩放手势和放大后切换下一页怎么实现

更多关于#HarmonyOS 鸿蒙Next挑战赛第四期# ArkUI声明式编程仿朋友圈九宫格图片和大图预览的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


大佬们,这个用JAVA怎么实现呀

写的真不错,是个常用场景,棒棒···

针对“#HarmonyOS 鸿蒙Next挑战赛第四期# ArkUI声明式编程仿朋友圈九宫格图片和大图预览”的问题,以下是一个简要的回答:

在鸿蒙系统的ArkUI声明式编程中,实现仿朋友圈九宫格图片和大图预览功能,主要涉及到布局管理和图片资源的处理。

首先,可以使用ArkUI的Flexbox布局或者Grid布局来创建九宫格效果。通过设置适当的行和列数,以及每个单元格的大小,可以方便地实现九宫格布局。

对于图片资源,可以使用ArkUI提供的Image组件来加载和显示图片。为了实现大图预览功能,可以在点击某个图片时,通过导航或者状态管理的方式,将当前图片的地址传递给一个新的页面或者组件,然后在该页面或组件中使用更大的Image组件来显示图片。

此外,为了提升用户体验,还可以添加一些动画效果,比如点击图片时的缩放动画,以及在大图预览页面添加滑动切换图片的功能。

需要注意的是,在实现过程中要确保图片的加载和显示效率,避免因为图片过大或者数量过多导致性能问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部