实现弧形菜单功能鸿蒙示例代码

本文原创发布在华为开发者社区

介绍

本示例介绍弧形菜单的场景化案例。

实现弧形菜单功能源码链接

效果预览

使用说明

  1. 进入应用会立马出现弧形菜单。
  2. 可通过滑动进行菜单旋转。

实现思路

弧形菜单展示,通过手势旋转菜单位置。核心代码如下,源码参考Index.ets

typescript 复制代码
Column() {
  Stack() {
    ForEach(this.imageList, (item: string, index: number) => {
      Image($r(item))
        .width(this.ImageWidth)
        .height(this.ImageHeight)
        .border({ color: "#FFF", width: 2 })
        .position({
          x: this.points[index][0],
          y: this.points[index][1]
        })
        .objectFit(ImageFit.Auto)
        .rotate({ centerX: 100 / 2, centerY: 200 / 2, angle: this.getAngele(index) })
        .zIndex(this.imageList.length - index)
        .id(`${index}`)
    })
  }
  //centerY = 图片高度 + 圆的半径
  .rotate({ angle: this.stackAngle, centerY: 200 + 100 })
}.height('100%')
  .width('100%')
  .backgroundColor("#ffa7a7a7")
  .gesture(
    PanGesture(this.panOption)
      .onActionStart((event: GestureEvent) => {
        Logger.info('Pan start ' + event.offsetX)
        let info = event.fingerList[0]
        this.x1 = px2vp(this.screenWidth) / 2 - info.globalX
        this.y1 = 200 + 100 - info.globalY
        Logger.info('Pan start ' + this.x1 + ' ' + this.y1)
      })
      .onActionEnd((event: GestureEvent) => {
        Logger.info('Pan start ' + event.offsetY)
        Logger.info('Pan start ' + this.x2 + ' ' + this.y2)
      })
      .onActionUpdate((event: GestureEvent) => {
        Logger.info('this.stackAngle = ' + this.stackAngle)
        if (event) {
          let info = event.fingerList[0]
          this.x2 = px2vp(this.screenWidth) / 2 - info.globalX
          this.y2 = 200 + 100 - info.globalY
          this.distance = Math.sqrt((event.offsetX) * (event.offsetX) + (event.offsetY) * (event.offsetY))
          if ((this.x1 * this.y2 - this.x2 * this.y1) > 0) {
            this.stackAngle = (this.stackAngle + (this.distance / 60)) % 360
          } else {
            this.stackAngle = (this.stackAngle - (this.distance / 60)) % 360
          }
        }
      })
  )
相关推荐
不会算法的小灰11 分钟前
HTML简单入门—— 基础标签与路径解析
前端·算法·html
zero13_小葵司15 分钟前
在Vue项目中构建后端配置的动态路由及权限控制体系
前端·javascript·vue.js
GISer_Jing15 分钟前
前端框架篇——Vue&React篇
前端·javascript
面向星辰16 分钟前
css其他选择器(精细修饰)
前端·css
子兮曰20 分钟前
WebSocket 连接:实现实时双向通信的前端技术
前端·javascript·websocket
宁雨桥22 分钟前
从视口到容器:CSS 容器查询完全指南
前端·css
wu~9701 小时前
web服务器有哪些?服务器和web服务器有什么区别
运维·服务器·前端
FIN66681 小时前
募投绘蓝图-昂瑞微的成长密码与未来布局
前端·后端·5g·云原生·信息与通信·射频工程·芯片
cooldream20091 小时前
深度解析中秋节HTML5动画的实现
前端·html·html5
jump_jump3 小时前
超长定时器 long-timeout
前端·javascript·node.js