鸿蒙开发之图片选择器

一、使用

系统的图片选择器真的非常友好,这个绝对要赞一下。

pickPhotos() {
//初始化一个photopicker
let photoPicker = new picker.PhotoViewPicker()
   
//maxSelectNumber最多选择多少张(默认值为50,最大值为500)
//MIMEType 选择文件的类型
photoPicker.select({maxSelectNumber:9,MIMEType:picker.PhotoViewMIMETypes.IMAGE_TYPE}).then(val => {
      //通过val.photoUris就可以拿到图片的Uri数组了
      //val.photoUris
      
    }).catch(err => {
      Prompt.showToast({message:'获取图片失败'})
    })

  }

二、实现图片删除

长按图片,给图片添加一个抖动的动画。这里借助了z轴旋转动画实现。

import picker from '@ohos.file.picker'
import Prompt from '@system.prompt'

/*
 * 开发中动画实现上遇到一个问题不能停止动画的问题
 * 一开始想的是直接操作旋转的角度和z轴的值,但是发现有些gridItem不生效还会动
 * 群友提供了一个思路:
 * 在动画finish回调中不断的重置旋转的角度和z轴的值达到开启关闭动画
 * */

@Entry
@Component
struct OfficialPhotoPickPage2 {

  @State imageUris: string[] = ["https://tse1-mm.cn.bing.net/th/id/OIP-C.LWCXuZysYTsReGHGVjKBvAAAAA?w=211&h=211&c=7&r=0&o=5&dpr=1.9&pid=1.7"
  ,"https://tse3-mm.cn.bing.net/th/id/OIP-C.mmUrUJJ8RtIXNpFFU1XqsgAAAA?w=211&h=211&c=7&r=0&o=5&dpr=1.9&pid=1.7"
  ,"https://c-ssl.dtstatic.com/uploads/blog/202307/03/9WSX9PPas8AzV3V.thumb.400_0.jpeg"
  ,'https://tse2-mm.cn.bing.net/th/id/OIP-C.V7iv7AMzhwagJ3oyhiHvnAAAAA?w=210&h=210&c=7&r=0&o=5&dpr=1.9&pid=1.7']
  stroller: Scroller = new Scroller()
    //监听该属性来动态改变grid的高度
  @State gridHeight: number = 200
    //监听操作按钮显示与否设置动画属性
  @State showDelBtn: boolean = false
    //angle不断改变值来达到动画的停止与启用
  @State angle: number = 0
    //设置动画z轴值
  @State imageRotate: number = 0

//抖动动画
  startAnim(){
    animateTo({
      duration:100,
      curve:Curve.EaseInOut,
      iterations:1,
      playMode:PlayMode.Alternate,
      onFinish:()=>{//在结束的时候通过按钮显示与否改变动画属性
        if( this.showDelBtn ){
          this.angle = this.angle === 0 ? 5 : 0
          this.imageRotate = this.imageRotate === 0 ? 1 : 0;
          this.startAnim();
        }
      }
    },()=>{
    })
  }


  build() {
    Column() {
      Grid() {
        ForEach(this.imageUris,(item,index) => {
          GridItem() {
            Stack() {
              Image(item)
                .borderWidth(3)
                .borderRadius(20)
                .width(100)
                .height(100)
                .margin({top:20})
                .rotate({
                  z:this.imageRotate,
                  angle:this.angle
                })

              Button(){
                //warning '这里记得替换成关闭图片'
                Image($rawfile('guanbi.png'))
                  .width(20)
                  .height(20)
              }
              .fontColor(Color.White)
              .fontSize(15)
              .width(this.showDelBtn ? 20 : 0)
              .height(this.showDelBtn ? 20 : 0)
              .margin({top:15,right:0,left:80})
              .onClick(() => {
                //删除某个图片,并关闭动画
                this.showDelBtn = false
                this.imageUris.splice(index,1)
                this.gridHeight = ((this.imageUris.length/3)+(this.imageUris.length%3>0?1:0))*130
                this.angle = 0
                this.imageRotate = 0
              })
            }
            .alignContent(Alignment.TopEnd)
          }
          .gesture(LongPressGesture({repeat:true}).onAction(() => {
            //长按显示按钮,并开始抖动动画
            this.showDelBtn = true
            this.angle = 5
            this.imageRotate = 1
            this.startAnim();
          }))
        })
      }
      .columnsGap(10)
      .rowsGap(10)
      .width('90%')
      .backgroundColor(Color.Gray)
      .margin({top:20})

      Button('请选择图片')
        .type(ButtonType.Capsule)
        .width(150)
        .height(40)
        .margin({top:30})
        .onClick(() => {
          this.pickPhotos()
        })
    }
    .width('100%')
    .height('100%')
  }

//图片选择
  pickPhotos() {
    let photoPicker = new picker.PhotoViewPicker()
       photoPicker.select({maxSelectNumber:9,MIMEType:picker.PhotoViewMIMETypes.IMAGE_TYPE}).then(val => {
        //现有数据与选择的数据拼接
      this.imageUris = [...this.imageUris,...val.photoUris]
        //更新grid的高度
      this.gridHeight = ((this.imageUris.length/3)+(this.imageUris.length%3>0?1:0))*100
    }).catch(err => {
      Prompt.showToast({message:'获取图片失败'})
    })

  }
}

  • 26
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为鸿蒙HarmonyOS开发整理资料汇总,共38份。 1学前必读:HarmonyOS学习资源主题分享 2学前必读:OpenHarmony-联盟生态资料合集 3-1.HarmonyOS概述:技术特性 3-2.HarmonyOS概述:开发工具与平台 3-3.HarmonyOS概述:系统安全 3-4.HarmonyOS概述:系统定义 3-5.HarmonyOS概述:下载与安装软件 3-6.HarmonyOS概述:应用开发基础知识 3-7.HarmonyOS概述:最全HarmonyOS文档和社区资源使用技巧 4-1.生态案例:【开发者说】重塑经典,如何在HarmonyOS手机上还原贪吃蛇游戏 4-2.生态案例:HarmonyOLabo涂鸦鸿蒙亲子版 4-3.生态案例:HarmonyOS分镜头APP案例 4-4.生态案例:HarmonyOS时光序历史学习案例 4-5.生态案例:HarmonyOS先行者说 宝宝巴士携手HarmonyOS共同打造儿童教育交互新体验 4-6.生态案例:HarmonyOS智能农场物联网连接实践 4-7.生态案例:分布式开发样例,带你玩转多设备 4-8.生态案例:华为分布式日历应用开发实践 5-1.【Codelab】HarmonyOS基于图像模块实现图库图片的四种常见操作 5-2.【CodeLab】手把手教你创建第一个手机“Hello World” 5-3.【Codelab】如此简单!一文带你学会15个HarmonyOS JS组件 5-4.【Codelab】懒人“看”书新法—鸿蒙语音播报,到底如何实现? 5-5.【Codelab】基于AI通用文字识别的图像搜索,这波操作亮了 5-6.【Codelab】开发样例概览 6-1.技术解读之HarmonyOS轻量JS开发框架与W3C标准差异分析 6-2.技术解读之HarmonyOS驱动加载过程分析 6-3.技术解读之HarmonyOS组件库使用实践 6-4.技术解读之华为架构师解读:HarmonyOS低时延高可靠消息传输原理 6-5.技术解读之解密HarmonyOS UI框架 6-6.技术解读之如何从OS框架层面实现应用服务功能解耦 7-1.常见问题之HarmonyOS元服务的设计与开发解析 7-2.常见问题之Java开发 7-3.常见问题之JS开发 7-4.常见问题之模拟器登录 7-5.常见问题之模拟器运行 7-6.常见问题之如何使用JsJava开发HarmonyOS UI 7-7.常见问题之应用配置 7-8.常见问题之预览器运行 8【视频合集】入门到进阶视频学习资料合集30+

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值