鸿蒙(HarmonyOS)应用开发实战——底部抽屉滑动效果案例

238 篇文章 1 订阅
200 篇文章 0 订阅

往期知识点整理

介绍

本示例主要介绍了利用List实现底部抽屉滑动效果场景,并将界面沉浸式(全屏)显示,及背景地图可拖动。

效果图预览

使用说明

  1. 向上滑动底部列表,支持根据滑动距离进行分阶抽屉式段滑动。

实现思路

本例涉及的关键特性和实现方案如下:

  1. 使用RelativeContainer和Stack布局,实现可滑动列表在页面在底部,且在列表滑动到页面顶部时,显示页面顶部标题栏。
Stack({ alignContent: Alignment.TopStart }) {
  RelativeContainer() {
    // Image地图
    ImageMapView()
    // 底部可变分阶段滑动列表
    List({ scroller: this.listScroller }) {
    ...
    }
    .alignRules({
      'bottom': { 'anchor': '__container__', 'align': VerticalAlign.Bottom },
      'left': { 'anchor': '__container__', 'align': HorizontalAlign.Start },
      'right': { 'anchor': '__container__', 'align': HorizontalAlign.End },
    })
  }
  StatusHead({
    statusBarHeight: this.statusBarHeight,
    topHeaderHeight: CommonConstants.PAGE_HEADER_HEIGHT,
    isShow: this.isShow
  })
}
  1. 通过对List设置onTouch属性,记录手指按下和离开屏幕纵坐标,判断手势是上/下滑。
List({ scroller: this.listScroller }) {
  ListItemGroup({ header: this.itemHead("安全出行季") }){
  ...
  }
}
.onTouch((event) => {
  switch (event.type) {
    // 手指按下触摸屏幕
    case TouchType.Down: {
      this.yStart = event.touches[0].y;  // 手指按压屏幕的纵坐标
      break;
    }
    // 手指在屏幕移动      
    case TouchType.Move: {
      let yEnd = event.touches[0].y; // 手指离开屏幕的纵坐标
      let height = Math.abs(Math.abs(yEnd) - Math.abs(this.yStart)); // 手指在屏幕上的滑动距离
      let maxHeight = this.windowHeight - this.statusBarHeight; // list列表的最大高度
      // 判断上滑,且list跟随手势滑动
      if (yEnd < this.yStart) {
        this.isUp = true;
        ...
      }
      else {
        this.isUp = false;
        ...
      }
    }
  }
})
  1. 根据手指滑动的长度对列表高度进行改变(以上滑为例)。
this.isScroll = false;
this.listHeight = temHeight;
  1. 在手指滑动结束离开屏幕后,通过判断此时列表高度处于哪个区间,为列表赋予相应的高度(以上滑为例)。
switch (event.type) {
  case TouchType.Up: {
    this.yStart = event.touches[0].y;
    let maxHeight = this.windowHeight - this.statusBarHeight; // 设置list最大高度
    // 列表上滑时,分阶段滑动
    if (this.isUp) {
      // 分阶段滑动,当list高度位于第一个item和第二个item之间时,滑动到第二个item
      if (this.listHeight > CommonConstants.LIST_HEADER_HEIGHT + this.firstListItemHeight && this.listHeight <= CommonConstants.LIST_HEADER_HEIGHT + this.firstListItemHeight + this.bottomAvoidHeight + this.secondListItemHeight) {
        this.listHeight = CommonConstants.LIST_HEADER_HEIGHT + this.firstListItemHeight + this.secondListItemHeight;
        this.isShow = false;
        return;
      }
      // 分阶段滑动,当list高度位于顶部和第二个item之间时,滑动到页面顶部
      if (CommonConstants.LIST_HEADER_HEIGHT + this.firstListItemHeight + this.bottomAvoidHeight + this.secondListItemHeight < this.listHeight && this.listHeight <= maxHeight) {
        this.listHeight = maxHeight;
        this.isScroll = true;
        this.isShow = true;
        return;
      }
      // 分阶段滑动,当list高度大于最大高度,list滑动到页面顶部内容可滚动
      if (this.listHeight >= maxHeight) {
        this.isScroll = true;
        this.isShow = true;
        return;
      }
    }
    else {
      // 下滑阶段
      ...
    }
    break;
  }
}

高性能知识点

不涉及

工程结构&模块类型

bottomdrawerslidecase                // har类型
|---src/main/ets/constants
|   |---CommonConstants              // 常量
|---src/main/ets/components
|   |---Component                    // 自定义组件
|---src/main/ets/utils
|   |---ArrayUtil.ets                // 数组控制
|   |---dataSource.ets               // 数据类型文件
|   |---WindowModel.ets              // 窗口管理器
|---src/main/ets/view
|   |---BottomDrawerSlideCase.ets    // 列表吸顶穿透界面

推荐

总是有很多小伙伴反馈说:鸿蒙开发不知道学习哪些技术?不知道需要重点掌握哪些鸿蒙开发知识点? 为了解决大家这些学习烦恼。在这准备了一份很实用的鸿蒙全栈开发学习路线与学习文档给大家用来跟着学习。

针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植……等)技术知识点。

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

在这里插入图片描述

鸿蒙开发面试真题(含参考答案):

在这里插入图片描述

《OpenHarmony源码解析》:

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview

图片

HarmonyOS提供了丰富的动画框架,用于创建流畅且吸引人的用户界面交互体验。从底部弹出再收回动画是一种常见的界面动画效果,通常用于展示或隐藏某些UI组件,如抽屉式菜单或弹出窗口。 在HarmonyOS中实现这样的动画,你可以使用动画框架中的`AbilitySlice`来控制动画的展示与隐藏。下面是一个简化的代码示例来说明基本的实现步骤: ```java // 创建一个动画对象,这里是一个简化的示例,实际开发中需要根据具体需求编写动画描述 Animation slideAnimation = new Animation() { // 设置动画的起始位置和结束位置 @Override protected void applyTransformation(float interpolatedTime, Transformation t) { // 根据插值时间计算动画的变换,interpolatedTime在0.0到1.0之间变化 // 以实现动画的加速和减速效果 float slideDistance = interpolatedTime * 具体距离值; // 具体距离值需根据实际UI尺寸来设定 // 设置动画变换,如移动动画 t.setTranslationY(slideDistance); } @Override public void animate(AbilitySlice target, Effect effect) { super.animate(target, effect); // 动画开始前和动画结束后可以执行一些操作,比如设置可见性等 } }; // 控制动画的执行,使UI组件从底部弹出 slideAnimation.start(); // 动画结束后,可以执行收回动画,即重新将UI组件移动到原来的位置 // 这里同样需要创建一个新的动画对象,实现方式与弹出动画类似,只是方向相反 Animation slideBackAnimation = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { float slideBackDistance = (1 - interpolatedTime) * 具体距离值; t.setTranslationY(slideBackDistance); } @Override public void animate(AbilitySlice target, Effect effect) { super.animate(target, effect); // 动画开始前和动画结束后可以执行一些操作,如隐藏UI组件等 } }; // 控制动画的执行,使UI组件收回 slideBackAnimation.start(); ``` 在实际开发中,需要根据具体UI组件和布局来调整动画的具体参数,并且可能需要结合布局更新和生命周期事件来更精确地控制动画效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值