HarmonyOS鸿蒙Next中如何实现酷狗音乐菜单切换页面缩放功能?

HarmonyOS鸿蒙Next中如何实现酷狗音乐菜单切换页面缩放功能? 如何实现鸿蒙版酷狗音乐菜单切换页面缩放功能?

5 回复

支持一下

更多关于HarmonyOS鸿蒙Next中如何实现酷狗音乐菜单切换页面缩放功能?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


🫡感谢老铁,

效果

https://alliance-communityfile-drcn.dbankcdn.com/FileServer/getFile/cmtybbs/567/739/627/0030086000567739627.20251226013022.84753796517581726258109870450075:50001231000000:2800:17AF506D88C461536631AE45CDD841DC9B4169CE0392AADFF82C651085F79D30.gif

实现思路

  1. 实现两个界面页面布局渲染
  2. 给第1个界面缩放属性、给第二个界面平移属性
  3. 点击事件后,通过animateTo控制响应式状态即可

完整代码

import { ProfileInfo } from "../components/profile/ProfileInfo"
import { Settings } from "../components/profile/Settings"

@Builder
export function PageOneBuilder() {
  Profile()
}

@Component
struct Profile {
  @Provide pageScaleX: number = 1
  @Provide pageScaleY: number = 1
  @Provide pageTranslateX: string = '0%'  // -百分比 页面先左  就会出现侧边栏

  @StorageProp('bottomRectHeight') bottomRectHeight: number = 0;

  build() {
    NavDestination() {
      Row() {
        Column() {
          // 主页面   可以随便搞一个有宽度高度的盒模型
          // ProfileInfo()
        }.width('100%').height('100%')
        .translate({ x: this.pageTranslateX })
        .scale({ x: this.pageScaleX, y: this.pageScaleY, centerX: '100%' })
        .onClick(() => {
          animateTo({ duration: 300 }, () => { // 主页面点击还原布局
            this.pageScaleX = this.pageScaleY = 1
            this.pageTranslateX = '0%'
          })
        })
        Column() {
          // 功能区页面  可以随便搞一个有宽度高度的盒模型
          // Settings()
        }.width('100%').height('100%').translate({ x: this.pageTranslateX })
      }.width('100%').height('100%')
    }.hideTitleBar(true).padding({ bottom: px2vp(this.bottomRectHeight) })
  }
}

在HarmonyOS Next中,可通过ArkUI的显式动画(animateTo)结合属性动画实现页面缩放。使用Column或Stack布局承载菜单,绑定手势事件(如点击或滑动)触发动画。在animateTo中动态修改组件的scale属性,配合curve曲线与duration时长控制缩放效果。例如,点击菜单项时,调用animateTo将目标页面的scale从0.5渐变为1.0,实现平滑缩放切换。

在HarmonyOS Next中实现类似酷狗音乐的菜单切换页面缩放功能,核心是利用ArkUI的组件动画与手势交互能力。以下是关键实现思路和步骤:

  1. 布局结构:使用StackFlex作为根容器,分别放置菜单栏(如底部Tab栏)和主内容区(Swiper组件实现可滑动页面)。

  2. 手势监听与动画

    • 为内容区域绑定捏合手势PinchGesture),通过onActionStartonActionUpdateonActionEnd事件获取缩放比例。
    • 使用animateTo或属性动画(例如scale属性)实现平滑缩放效果:
    // 示例:缩放动画
    [@State](/user/State) scaleValue: number = 1.0;
    ...
    .gesture(
      PinchGesture()
        .onActionUpdate((event: GestureEvent) => {
          this.scaleValue = event.scale; // 更新缩放比例
        })
    )
    .scale({ x: this.scaleValue, y: this.scaleValue })
    
  3. 菜单联动

    • 监听页面滑动(SwiperonChange事件)或缩放状态,通过状态变量控制菜单栏的显隐/样式变化。
    • 可结合透明度动画opacity)或位移动画translate)实现菜单栏的淡入淡出或上下移动效果。
  4. 性能优化

    • 对复杂内容使用LazyForEach懒加载。
    • 缩放时考虑使用clip属性限制渲染区域,避免过度绘制。
  5. 交互细节

    • 添加缩放阈值(如最大/最小缩放比例限制)。
    • 可通过双击手势(DoubleTapGesture)快速复位缩放比例。

此方案通过ArkUI声明式语法与手势API结合,能高效实现视觉交互统一的页面缩放效果。具体参数需根据实际UI设计调整。

回到顶部