HarmonyOS NEXT星河版之模拟图片选择器(下)---使用Swiper实现图片滑动预览

news2024/11/15 12:03:23

文章目录

    • 一、目标
    • 二、开撸
      • 2.1 改造图片预览Dialog
      • 2.2 改造主页面
      • 2.3 主页面完整代码
    • 三、小结

一、目标

在前面的介绍中,查看选中的图片都是单张预览,接下来要改造成多张可滑动预览,如下:
在这里插入图片描述

二、开撸

2.1 改造图片预览Dialog

@CustomDialog
export struct SinglePreviewDialog {
  // 弹窗控制器 must
  controller: CustomDialogController
  // 展示图片URL列表
  imgUrlList: ResourceStr[] = []
  // 当前点击索引
  selectIndex: number = 0

  build() {
    if (this.imgUrlList && this.imgUrlList.length) {
      Column() {
        // 使用Swiper组件
        Swiper() {
          ForEach(this.imgUrlList, (item: ResourceStr) => {
            Image(item)
              .width('100%')
          })
        }
        // 绑定当前index
        .index(this.selectIndex)
      }
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.Center)
      .backgroundColor(Color.Black)
      .onClick(() => {
        // 关闭弹窗
        this.controller.close()
      })
    }

  }
}

2.2 改造主页面

声明当前点击图片索引:

// 当前图片索引
selectIndex: number = 0

点击图片时,给索引赋值:

Image(item.imgUrl)
    .aspectRatio(1)
    .onClick(() => {
      // this.selectImgUrl = item.imgUrl
      this.selectIndex = index
      this.singlePreviewDialog.open()
    })

对预览Dialog在初始化时,更改传参:

singlePreviewDialog: CustomDialogController = new CustomDialogController({
  builder: SinglePreviewDialog({
    imgUrlList: this.selectImgList.map(item => item.imgUrl),
    selectIndex: this.selectIndex
  }),
  customStyle: true //使用自定义Dialog的样式
})

2.3 主页面完整代码

import { PhotoAlbumView } from './components/PhotoAlbumView';
import { SelectImageItem } from './models';
import { promptAction } from '@kit.ArkUI';
import { SinglePreviewDialog } from './dialog/SinglePreviewDialog';

@Entry
@Component
struct PhotoAlbumDemoPage {
  @State message: string = 'Hello World';
  @State showPhotoAlbum: boolean = false
  @State selectImgList: SelectImageItem[] = []
  // 当前选中图片
  selectImgUrl: ResourceStr = ''
  // 当前图片索引
  selectIndex: number = 0
  // 单图预览dialog
  singlePreviewDialog: CustomDialogController = new CustomDialogController({
    builder: SinglePreviewDialog({
      imgUrlList: this.selectImgList.map(item => item.imgUrl),
      selectIndex: this.selectIndex
    }),
    customStyle: true //使用自定义Dialog的样式
  })

  @Builder
  sheetPhotoAlbum() {
    Column() {
      PhotoAlbumView({
        maxNumber: 5,
        cancel: () => {
          this.showPhotoAlbum = false
        },
        confirm: (selectImgList: SelectImageItem[]) => {
          this.showPhotoAlbum = false
          this.selectImgList = [...this.selectImgList, ...selectImgList]
        }
      })
    }
  }

  build() {
    Column() {
      Button('打开相册')
        .onClick(() => {
          this.showPhotoAlbum = true
        })
      Text('已选择图片:')
        .width('100%')
        .textAlign(TextAlign.Start)
      if (this.selectImgList && this.selectImgList.length) {
        Grid() {
          ForEach(this.selectImgList, (item: SelectImageItem, index: number) => {
            GridItem() {
              Stack() {
                Image(item.imgUrl)
                  .aspectRatio(1)
                  .onClick(() => {
                    // this.selectImgUrl = item.imgUrl
                    this.selectIndex = index
                    this.singlePreviewDialog.open()
                  })
              }
            }
          }, (item: SelectImageItem) => JSON.stringify(item))
        }
        .columnsTemplate('1fr 1fr 1fr')
        .columnsGap(5)
        .rowsGap(5)
        .padding(10)
        .layoutWeight(1)
      }
      // if (this.showPhotoAlbum) {
      //   PhotoAlbumView({
      //     maxNumber: 5,
      //     cancel: () => {
      //       this.showPhotoAlbum = false
      //     },
      //     confirm: (selectImgList: SelectImageItem[]) => {
      //       this.showPhotoAlbum = false
      //       this.selectImgList = [...this.selectImgList, ...selectImgList]
      //     }
      //   })
      // }
    }
    .width('100%')
    .height('100%')
    .bindSheet($$this.showPhotoAlbum, this.sheetPhotoAlbum(), {
      showClose: false, // 是否显示右上角关闭按钮
      height: '70%' // 显示高度占比
    })
  }
}

三、小结

  • Swiper组件基本使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1666017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【c++】set、map用法详解

set、map用法详解 1. 关联式容器2. 键值对2.1 :pair2.2:make_pair 3. 树形结构的关联式容器3.1:set构造函数find()erase()insert()count()lower_bound()upper_bound() 3.2:multiset3.3:map构造函数insert()operator[] …

如何在bud里弄3d模型?---模大狮模型网

随着数字化设计的不断发展,越来越多的设计软件提供了对3D模型的支持,为设计师们带来了更广阔的创作空间。Bud作为一款功能强大的设计工具,也提供了添加和编辑3D模型的功能,让用户能够更加灵活地进行设计创作。本文将为您详细介绍如…

最新网页版USB转串口芯片CH340中文规格书手册(20240511)

前言 南京沁恒的产品已经很成熟了,完全可替代国外USB转串口产品,不必迷信FT232,CP2102之类了。 另外,急着买芯片,直接跑过去的,看过几次妹子了:) CH340手册,基于网页3.3版本,规格书…

ARM单片机实现流水灯(GD32)

根据上图可知使用的引脚分别是PA8,PE6,PF6流水灯功能的实现要分别初始化这几个引脚 流水灯实现 编写流水灯代码 LED.C #include "gd32f30x.h" // Device header #include "Delay.h" // 初始化LED灯 void LED_Init(void){// 使能RCU时钟…

正点原子FreeRTOS学习笔记——列表与列表项

目录 一、什么是列表和列表项 1、概念 2、FreeRTOS代码 (1)列表 (2)列表项 (3)迷你列表项 二、列表与列表项初始化 1、列表初始化 2、列表项初始化 三、列表插入与删除列表项 1、原理解释 2、…

2024.1IDEA 到2026年

链接:https://pan.baidu.com/s/1hjJEV5A5k1Z9JbPyBXywSw?pwd9g4i 提取码:9g4i解压之后,按照 操作说明.txt 操作; IntelliJ IDEA 2024.1 (Ultimate Edition) Build #IU-241.14494.240, built on March 28, 2024 Licensed to gurgles tumbles You have…

如何给扫描好的3d模型贴图?---模大狮模型网

在数字化设计领域,3D模型的贴图是提升模型逼真度和视觉效果的重要步骤之一。尤其是对于扫描好的3D模型,通过添加适当的贴图,不仅可以增强模型的细节和真实感,还可以为设计带来更加生动的视觉体验。本文将为您详细介绍如何给扫描好…

探索全画面塑料焊接透光率检测仪的科技魅力

在精密工业和科研领域中,对材料的光学性能有着严格的要求。全画面塑料焊接透光率检测仪是一种先进的设备,它能够精确测量塑料焊接接头的透光率,确保焊接质量符合高标准。本文将详细介绍这一设备的特点、工作原理以及它在实际应用中的重要性。…

【Vue基础】Vue在组件数据传递详解

Vue核心基础-CSDN博客 先回顾Vue特性: Vue.js 是一个用于构建用户界面的渐进式框架,具有许多强大的特性。以下是一些主要的 Vue 特性: 响应式数据:Vue 使用双向绑定来实现数据的响应式更新。当数据发生变化时,视图会自…

LLM一些适合小白的入门项目和视频

AIX 大模型专区学习(史上最丰富🥳) https://github.com/stay-leave/enhance_llm 图谱大哥五一写得。 【对于卷积神经网络,硕士博士不需要搞明白原理,只要会应用是这样吗?-pytorch/深度学习/神经网络】 htt…

draw.io 网页版二次开发(3):打包和部署(war包)

目录 一 说明 二 环境配置 1. 下载并安装 Apache Ant 2. 下载并安装JDK和JRE 3. 下载tomcat 4. Ant、JDK和JRE 环境变量的配置 三 draw.io打包 四 部署 五 最后 一 说明 应公司项目要求,需要对draw.io进行二次开发,并将html界面通过iframe 嵌…

超详细的胎教级Stable Diffusion使用教程(四)

这套课程分为五节课,会系统性的介绍sd的全部功能和实操案例,让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion,它究竟有多强大? 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

stm32_RTC_2_HAL——stm32CudeMX

介绍 RTC(实时时钟)不仅仅提供计数功能,它是一个完整的时钟和日历模块,用于提供日期和时间信息。RTC 能够提供年、月、日、星期、时、分、秒等时间信息,并且通常具有闹钟功能,可以用于定时唤醒或触发事件。…

淘宝购物新玩法,用API接口解读商品评价

淘宝作为中国最大的网络购物平台之一,拥有海量的商品和众多的消费者评价。传统的购物方式往往需要花费大量的时间和精力筛选信誉度高的商品和有用的评价,而如今,联讯数据通过API接口,你可以更轻松地解读商品评价,挖掘出…

设施农业(大棚种植)远程监控系统设计 STM32+51单片机 含pcb 上下位机源码 原理图

目录 摘要 1. 引言 2. 系统方案 3. 系统硬件设计 4. 系统软件设计 5. 系统创新 6. 评测与结论 7、实物图 8、原理图 ​9、程序 10、资料内容 资料下载地址:设施农业(大棚种植)远程监控系统设计 STM3251单片机 含pcb 上下位机源码 原理图 论文 摘要 …

如何根据招聘信息打造完美简历

如何根据招聘信息打造完美简历 招聘信息分析简历调整策略个性化与关键词结语 在求职过程中,简历是第一块敲门砖。它不仅展示了你的专业技能和工作经验,还体现了你对所申请职位的理解和热情。然而,如何从招聘信息中提炼关键点,打造…

halcon 2D模板匹配 3D

一、概述 模板匹配常用于定位和查找,有很多的方式,halcon 中就有灰度匹配 、形状匹配、变形匹配、缩放匹配等,其实最常用的还是两种第一个就是灰度匹配、还有就是形状匹配 二、金字塔概述 网上有很多关于金字塔的解释,我这里直…

OpenHarmony 实战开发——轻量带屏解决方案之恒玄芯片移植案例

本文章基于恒玄科技BES2600W芯片的欧智通 Multi-modal V200Z-R开发板 ,进行轻量带屏开发板的标准移植,开发了智能开关面板样例,同时实现了ace_engine_lite、arkui_ui_lite、aafwk_lite、appexecfwk_lite、HDF等部件基于OpenHarmony LiteOS-M内…

基于PSO粒子群优化的PV光伏发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 粒子群优化算法基础 4.2 PV系统及其最大功率点跟踪 4.3 PSO在PV MPPT中的应用 5.完整工程文件 1.课题概述 基于PSO粒子群优化的PV光伏发电系统simulink建模与仿真。通过PSO粒子群优化进行最大功率…

C++之QT文本处理QDir、QFileDialog、QStringList、QFile

一、相应的头文件 #include <QFileDialog> #include <QDir> #include <QStringList> 二、简介 1.QFileDialog 实际效果如下&#xff1a;比如需要选择打开的文件夹或者文件名&#xff0c;通过调用资源管理器的方式进行可视化操作。 代码示例为&#xff1a…