基于HarmonyOS ArkUI 3.0 框架,成功开发了相册

wx618b6e7b14efc
发布于 2021-12-1 10:55
浏览
1收藏


HarmonyOS ArkUI 3.0 正式到来,今天就带大家感受一下HarmonyOS ArkUI 3.0 框架开发的相册功能,功能很简单,主要是图片放大和图片左右滑动事件。

实现效果

基于HarmonyOS ArkUI 3.0 框架,成功开发了相册-鸿蒙开发者社区

项目开发
创建新的应用
选择一个空的模板  
基于HarmonyOS ArkUI 3.0 框架,成功开发了相册-鸿蒙开发者社区

主要是选择开发语言为ets  
基于HarmonyOS ArkUI 3.0 框架,成功开发了相册-鸿蒙开发者社区

代码实现
hml结构:渲染函数

build() {
      // 超出屏幕,可滚动
    Scroll() {
      //      图片列表
      Flex({ wrap: FlexWrap.Wrap, justifyContent: FlexAlign.Center, alignContent: FlexAlign.Center }) {
        ForEach(this.imageList, (item, index) => {
          // 循环图片
          Image(item.url)
            .width(item.width)
            .height(item.height)
            .opacity(item.opacity)
            .onClick(() => {
              // 保存点击的id
              if (this.currentId === 0) {
                this.currentId = item.id
                this.currentIndex = this.currentId - 1
                this.isBig = true
              } else {
                this.currentId = 0
                this.currentIndex = -2
                this.isBig = false
              }
              this.changeList()
            })
            // 滑动事件
            .gesture(PanGesture({ direction: PanDirection.Horizontal })
              .onActionStart((e: GestureEvent) => { // 左右滑动开始
                // 保存开始的坐标
                if (!this.isBig) return false
                this.startX = e.offsetX
              })
              .onActionEnd((e: GestureEvent) => { // 左右滑动结束
                // 计算左滑还是右滑,初始化开始坐标
                if (!this.isBig) return false
                this.isSlideL = e.offsetX - this.startX > 0 ? false : true
                this.startX = 0
                this.showAnimate()
              })
            )
            .border({ width: 2, radius: 2, color: '#fff' })
        })
      }.width('100%')
    }

  }
  • 数据处理
  changeList() {
    this.imageList = this.imageList.map((item) => {
      const newI = item
      if (item.id === this.currentId && this.isBig) {
        newI.width = '100%'
        newI.height = '100%'
        newI.opacity = 1
      } else if (item.id !== this.currentId && this.isBig) {
        newI.width = '0%'
        newI.height = 0
        newI.opacity = 0
      } else {
        newI.width = '50%'
        newI.height = 200
        newI.opacity = 1
      }
      return newI
    })
  }
// 左右滑动,改变图片的透明度
  showAnimate() {
    //    计算下一个图片的index序列
    let nextIndex = this.currentIndex
    if (!this.isSlideL) {
      nextIndex -= 1
    } else {
      nextIndex += 1
    }
    nextIndex = nextIndex === this.imageList.length ? 0 : (nextIndex === -1 ? (this.imageList.length - 1) : nextIndex)
    //    将下一个图片序列赋值给当前的序列
    this.currentIndex = nextIndex
    this.imageList = this.imageList.map((item, index) => {
      const newI = item
      if (nextIndex === index) {
        newI.opacity = 1
        newI.width = '100%'
        newI.height = '100%'
      } else {
        newI.opacity = 0
        newI.width = '0%'
        newI.height = '0%'
      }
      return newI
    })
  }ndefined

方舟开发框架声明式编程很符合接下来前端的趋势,希望框架能越来越完善。

2
收藏 1
回复
举报
回复
    相关推荐