评论

draggable-sheet 组件:快速实现半屏拖拽

页面内的分段式拖拽、半屏拖拽放大...

在日常应用中,半屏可拖拽交互已经成为了用户体验的重要组成部分。页面内的分段式拖拽、半屏拖拽放大等等,这些常见的场景使用半屏拖拽交互可以很好的提升用户的体验感。

目前,实现半屏拖拽交互可以使用手势协商系统来实现,不过需要理解手势协商系统并编写相关代码。

考虑到半屏拖拽交互比较常见,为了让小程序开发者更加轻松地实现半屏拖拽交互,小程序 Skyline 渲染引擎推出了 draggable-sheet 组件。这个组件自带半屏拖拽交互,可以帮助开发者省去手势协商相关的代码,只需要简单配置容器大小、吸附阈值等参数即可实现半屏拖拽交互。无论是半屏弹窗、分段式半屏还是其他场景,draggable-sheet 组件都能帮助你实现更加出色的用户体验。

快速接入

使用 draggable-sheet 组件的流程如下:

Step 1. 配置 draggable-sheet 组件

在页面中引入 draggable-sheet 组件,并且配置 draggable-sheet 组件的参数,包括容器大小、吸附阈值等。

在 draggable-sheet 组件内嵌套 scroll-view 组件,且声明 associative-container="draggable-sheet" 将 scroll-view 组件与 draggable-sheet 组件进行关联即可。

<!-- page.wxml -->
<draggable-sheet
  class="sheet"
  initial-child-size="0.5"
  min-child-size="0.2"
  max-child-size="0.8"
  snap="{{true}}"
  snap-sizes="{{[0.4, 0.6]}}"
>
  <scroll-view
    scroll-y="{{true}}"
    type="list"
    associative-container="draggable-sheet"
    bounces="{{true}}"
  >
  <!-- 这里放置半屏内容 -->
  </scroll-view>
</draggable-sheet>


Step 2. 使用 DraggableSheetContext 接口控制滚动

使用 createSelectorQuery 方法获取 draggable-sheet 组件的节点,然后通过 node 方法获取 DraggableSheetContext 实例。调用 DraggableSheetContext.scrollTo 即可将 draggable-sheet 组件 滚动到指定位置。

// page.js
Page({
  onReady() {
    this.createSelectorQuery().select('.sheet').node().exec(res => {
      // 使用 sheetContext 控制 draggable-sheet 组件的滚动
      const sheetContext = res[0].node
      sheetContext.scrollTo({
        size: 0.7,
        animated: true,
        duration: 300,
        easingFunction: 'ease'
      })
    });
  },
});


使用 draggable-sheet 组件,你可以轻松实现半屏拖拽交互,让用户体验更加自由。同时,使用 DraggableSheetContext 接口,你可以动态控制 draggable-sheet 组件的行为,实现更加灵活的交互效果。 

例如,我们这里演示了使用 draggable-sheet 实现的 分享弹窗效果 和 分段式拖拽查看旅游景点列表~

与其他组件联动 

除了简单的半屏弹窗之外,我们还可以通过 worklet:onsizeupdate 回调,在 draggable-sheet 组件尺寸发生变化时,将 draggable-sheet 组件与其他组件进行动画交互。

例如,我们这里在 draggable-sheet 接近搜索框时,与搜索框衔接为一体,隐藏后面的页面,以此实现更流畅的展示效果。

首先,给 draggable-sheet 配置监听函数 worklet:onsizeupdate="onSizeUpdate"

<!-- page.wxml -->
<view class="search-wrp">
	...
</view>

<draggable-sheet
 class="sheet"
 ...
 worklet:onsizeupdate="onSizeUpdate"
>


然后,我们在 onSizeUpdate 发生变化时,通过 worklet 函数改变共享变量的值即可

Page({
  // 监听 draggable-sheet 尺寸变化去改变 progress
  onSizeUpdate(e) {
    'worklet'
    const distance = sheetHeight - e.pixels
    this.progress.value = distance >= 20 ? 1 : distance / 20
  },
  onLoad(options) {
    const progress = wx.worklet.shared(1)
    // 绑定 worklet 动画,progress 变化时改变搜索的背景来显示/隐藏 map
    this.applyAnimatedStyle('.search-wrp', () => {
      'worklet'
      const t = progress.value
      return {
        backgroundColor: `rgb(245, 242, 241, ${1 - t})` 
      }
    })
      ...
      this.progress = progress
    },
})


如果想要快速了解和实践本文中的案例,可在 PC 端点击 代码片段 进行调试。

注意:draggable-sheet 组件支持页面内的拖拽放大功能,如果需要实现页面返回的功能,可以使用 预设路由 来实现。

总结

draggable-sheet 组件通过拖拽的方式来展开或关闭一个面板,提供更加直观、自然的用户交互体验。不仅能够节省屏幕空间,让用户更加高效地利用界面,适用于展示评论列表、商品列表、展开筛选条件、展示更多信息等场景。对于需要提供更加灵活、自由的用户交互体验的小程序来说,draggable-sheet 组件是一个非常有用的功能。

因此,我们邀请大家尝试将这个能力应用到自己的小程序上,通过这个组件来提升用户体验和交互效果。结合其他组件和功能,打造出更加丰富、多样的小程序~

最后一次编辑于  02-26  
点赞 1
收藏
评论

1 个评论

  • ᯤ
    02-26

    问个其他问题,城市选择列表怎么配置

    02-26
    赞同
    回复 1
    • Mauejan
      Mauejan
      发表于移动端
      04-28
      😄
      04-28
      回复
登录 后发表内容