拖拽式交互
对比使用手势组件前后的操作,小程序半屏手势操作更加灵敏。用户仅需拖拽即可操作整个半屏页面,也能够与滚动组件无缝切换。
实现以上效果的原理主要是判断不同条件下由外层手势组件还是内层滚动组件 响应的问题。
【资料图】
当用户在半屏区域向下滑动时,
如果滚动条处于顶部,外层组件 pan-gesture-handler 响应拖动,半屏页面向下拖动至关闭
如果滚动条不处于顶部,内层组件 scroll-view 响应滑动,半屏的内容列表向下滑动至最底端
当用户在半屏区域向上滑动时,
如果半屏页面不完全打开,外层组件 pan-gesture-handler 响应拖动,半屏页面向上拖动至完全展示半屏
如果半屏页面完全打开,内层组件 scroll-view 响应滑动,半屏的内容列表向上滑动至最顶端
想要实现半屏页面的灵活操作,仅需新增调用pan-gesture-handler(用于拖动触发)以及vertical-drag-gesture-handler(用于纵向滑动触发)2个 即可快速实现。
编写 WXML 代码过程中,开发者主要使用 4 个核心属性,例如 on-gesture-event 等。编写 JS 代码过程中,开发者需要调用,改变半屏的状态值,使得小程序实现类似原生动画的体验。
拖拽式交互如此丝滑,你可以通过下面方式应用最佳实践:
通过微信开发者工具导入 (注意:使用 PC 端浏览器打开链接)
点击 查看完整代码
should-response-on-move=\"shouldPanResponse\"
simultaneous-handlers=\"{{["scroll"]}}\"
on-gesture-event=\"handlePan\">
native-view=\"scroll-view\"
should-response-on-move=\"shouldScrollViewResponse\"
simultaneous-handlers=\"{{["pan"]}}\">
...
// page.js
// shared 创建的变量为共享变量,可在 UI 线程和 JS 线程间同步
this.transY = wx.worklet.shared(1000)
this.scrollTop = wx.worklet.shared(0)
this.startPan = wx.worklet.shared(true)
// shouldPanResponse 和 shouldScrollViewResponse 用于 pan 手势和 scroll-view 滚动手势的协商
shouldPanResponse() {
"worklet"
return this.startPan.value
},
shouldScrollViewResponse(pointerEvent) {
"worklet"
// transY > 0 说明 pan 手势在移动半屏,此时 scroll-view 滚动不应生效
if (this.transY.value > 0) return false
const scrollTop = this.scrollTop.value
const { deltaY } = pointerEvent
// deltaY > 0 是往上滚动,scrollTop <= 0 是滚动到顶部边界,此时 pan 开始生效,scroll-view 滚动不生效
const result = scrollTop <= 0 && deltaY > 0
this.startPan.value = result
return !result
},
// pan 手势处理
handlePan(gestureEvent) {
"worklet"
if (gestureEvent.state === GestureState.ACTIVE) {
const curPosition = this.transY.value
const destination = Math.max(0, curPosition + gestureEvent.deltaY)
// 改变半屏的位置
this.transY.value = destination
}
// 其他手势状态的处理,如滚动结束时计算半屏处于打开还是关闭的状态
}
分段式交互
针对信息同时显示的需求,半屏页面是否有更好的交互?例如地图小程序开发者希望在展示多段导航信息的同时不影响用户查看当前定位。
分段式交互能够满足上述多信息显示的需求。用户通过自由拖拽和位置停留,实现分段式半屏效果。
分段式半屏的开发也很方便,在拖拽式交互的基础上增加当前半屏位置判断以响应分段式半屏还是内容列表。
既然分段式半屏如此方便,你可以通过下面方式快速应用:
通过微信开发者工具导入 (注意:使用 PC 端浏览器打开链接)
点击 查看完整代码
// page.js
// 设置 map scale
// 运行在 JS 线程
setMapScale(scale) {
this.setData({ scale })
},
// worklet 函数,运行在 UI 线程
scrollTo(toValue) {
"worklet"
let scale = 18
if (toValue > screenHeight / 2) {
scale = 16
}
// 从 UI 线程调回 JS 线程
wx.worklet.runOnJS(this.setMapScale.bind(this))(scale)
this.transY.value = timing(toValue, { duration: 200 })
},
// 处理拖动半屏的手势
handlePan(gestureEvent) {
"worklet"
// 滚动半屏的位置
if (gestureEvent.state === GestureState.ACTIVE) {
// deltaY < 0,往上滑动
this.upward.value = gestureEvent.deltaY < 0
// 当前半屏位置
const curPosition = this.transY.value
// 只能在 [statusBarHeight, screenHeight] 之间移动
const destination = clamp(curPosition + gestureEvent.deltaY, statusBarHeight, screenHeight)
if (curPosition === destination) return
// 改变 transY,来改变半屏的位置
this.transY.value = destination
}
if (gestureEvent.state === GestureState.END || gestureEvent.state === GestureState.CANCELLED) {
if (this.transY.value <= screenHeight / 2) {
// 在上面的位置
if (this.upward.value) {
this.scrollTo(statusBarHeight)
} else {
this.scrollTo(screenHeight / 2)
}
} else if (this.transY.value > screenHeight / 2 && this.transY.value <= this.initTransY.value) {
// 在中间位置的时候
if (this.upward.value) {
this.scrollTo(screenHeight / 2)
} else {
this.scrollTo(this.initTransY.value)
}
} else {
// 在最下面的位置
this.scrollTo(this.initTransY.value)
}
}
},
页面转场交互
针对更丰富的半屏内容,例如小程序助手需要展开多位成员的申请详情,转场半屏交互能够实现更顺滑的交互效果,给予用户更自然、友好的体验。
通过 与手势组件的结合,开发者不仅能够实现以上页面转场交互的效果,还能够实现更多类原生的页面切换效果。后续的文章将会详细分享自定义路由的最佳实践,敬请关注!
小程序手势组件助力开发者更高效地实现类原生交互的体验,对用户操作更友好。以半屏页面为例的场景通过手势操作实现丝滑、灵敏的效果,实现更丰富的应用。
未来小程序团队还会分享更多手势操作的实用案例,欢迎关注 ,发现更多小程序好用功能!
如有更多接口相关问题,可点击 发帖反馈,技术专员将为大家解答及进行深度交流。
推荐阅读
标签:
- 2023世界童模大赛全球启动
- 当前观点:瑞银收购瑞信落定 美国地区银行依旧前途未卜 谁来接手?
- 每日动态!为什么不建议个人交养老保险 有以下几大原因
- 全球微资讯!小程序手势 打开半屏新姿势
- 美联储联合五大央行加码美元互换协议,稳定流动性
- 天天热议:统计:韩国近50万年轻人不找工作单纯休息
- 世界微动态丨新加坡金管局:瑞信在新加坡的业务将继续运营
- 即时焦点:邮政信用卡到期后会自动寄新卡片吗 银行是这么回应的
- 世界热议:报告:中国和加拿大在清洁技术领域有较大合作空间和潜力
- ETF基金可以定投吗 专业人士这样说
- 自己缴社保和企业缴社保的比例是多少?自己缴社保和企业缴社保退休后工资有什么区别吗?
- 南京公积金贷款首付比例怎么定?公积金贷款利率是多少?
- 在异地就医如何备案?异地就医备案后刷医保卡怎么操作?
- 股票如何成交?股票委托失败的原因是什么?
- 抖音月付额度5万算高吗?如何提高抖音月付额度?
- 重大疾病的人还能买保险吗?重疾险包括什么?
- 可转债委托提示废单的原因有哪些?无法买入可转债是什么原因?
- 可转债的交易时间是几点?可转债委托卖出成交规定是什么?
- 用公积金可以贷款多少钱?用公积金贷款有什么好处?
- ETF基金能套利吗?ETF套利的方法有哪些?
- 首张碳中和信用卡来了!招行信用卡持续连接趋势!
- 环球精选!经合组织预计2023年全球经济增长2.6%
- 天天简讯:出境游扩容复苏显著,上海赴马来西亚首发团“接福利”
- 环球焦点!2023版熊猫金币30克今天报价(2023年03月20日)
- 异地就医备案后可以刷医保卡吗 看这篇就够了
- 自己缴社保和企业缴社保退休后拿的退休工资一样吗 答案如下
- 各大银行提前还款时间规定是什么 是怎么规定
- 【天天热闻】普洱镇沅八大茶区春茶陆续开采
- 香港金管局:瑞士信贷在港业务照常运行 未构成重大风险
- 基金卖出为什么还在亏?基金出现亏损怎么解决?
- 车辆意外被火烧了保险给赔吗 视情况而定
- 【世界时快讯】南京公积金贷款最多可以贷多少 规定是这样的
- 环球要闻:台州5年投入2000万,为1.4万余名一线职工开展疗休养
- “娘家人”带着“法援”来了
- 得了重大疾病还能买保险吗 情况是这样的
- 达州首次在舟山建立疗休养基地
- 【热闻】可转债委托卖出什么时候能成交 交易规则是什么
- 【高端访谈】硅谷银行关闭动摇民众对美银行业信心——访英国剑桥大学学者查尔斯·里德
- 全球今热点:股票委托失败是什么原因 一般有以下原因
- 环球即时看!美媒:如果一半储户提走存款 美国186家银行面临倒闭风险
- 世界快报:重庆长期护理保险政策是什么 详细规定如下
- 热头条丨抖音月付额度怎么提高 方法在这儿
- 全球视点!欧股全线下挫 瑞信上周累跌21%
- 当前最新:龙游劳模工匠志愿集市热闹非凡
- 观焦点:见证历史!总对价30亿瑞郎 瑞银“四折”收购瑞信
- 每日快看:SEG Solar完成美国工厂收购 组件年产能预计超过2GW
- 11万的车定损4万可以报废吗 答案是这样的
- 全球新资讯:个人养老金什么时候可以领取 这几种情况下可领取
- 插画师的就业前景怎么样?插画师的薪资待遇高吗?
- 学习西点好就业吗?西点师的薪资待遇是多少?
- 高铁乘务员就业前景好吗?报考高铁乘务员的条件是什么?
- 家政服务是干什么的?家政服务的项目包括哪些?
- 怎么办理个体营业执照?办个体营业执照的资料有哪些?
- 物流专员的真实工资是多少?物流专员主要是干什么的?
- 办公室文员基本工资一般是多少?办公室文员的工作内容有哪些?
- 看热讯:成都职工医保断交后医保卡里的钱还能用吗 规定如下
- 世界快资讯丨涉案上百亿!安徽、山东、云南打掉多个涉赌犯罪团伙
- 天天报道:【环球财经】美联储联合五大央行增加美元流动性应对银行危机
- 重庆医保门诊报销新规定2023年最新是什么 最新规定如下
- ETF基金在哪里买比较安全 在哪里可以买
- 快消息!海南省今起执行近三年最大规模药品集采中选结果
- 视讯!海南打造两场主题分论坛 聚焦农业合作与自贸港发展
- 天天讯息:消博会“全球消费论坛”第二批活动公布
- 环球看热讯:硅谷银行波及A股几何
- 全球热讯:机场等门户枢纽进入“博鳌时间”
- 怎么删除美柚的打卡内容?美柚删除打卡的操作步骤
- 如何获得维词的复活卡?维词获得复活卡的操作流程
- 怎么编辑豆瓣里的关于我?豆瓣关于我的编辑教程
- 怎么查看点淘的版本号?点淘查看版本号的操作流程
- 怎么查看豆瓣加入书架的书?豆瓣加入书架的书查看教程
- 怎么在百度地图里创建新地图?百度地图创建地图的操作方法
- 关闭电脑启动项在哪里设置?设置电脑启动项关闭的操作教程
- 电脑设置在哪里?查看电脑设置的操作教程
- 电脑怎么能开启高性能模式?Win11系统开启高性能模式的教程
- 今日要闻!实现意向成交额25.6亿元,2023哈尔滨冰雪博览会圆满闭幕
- 海南文昌东阁55亩黑金刚莲雾抢“鲜”上市
- 环球热点!“夏日CP”归来!海南下周将出现高温+雷雨天气
- 当前视点!黄金时间·硅谷银行事件会对亚洲产生传导影响?分析人士:反正买黄金就对了
- 世界微资讯!美联储联手全球主要央行加强美元流动性供给
- 海南琼海房管中心短信通知保障性住房申领成功?假的!
- 当前热讯:海南核电开创全球核电核岛关键设备检修5G应用先河
- 环球快资讯:@海南中考生 符合条件考生可享受照顾加分
- 瑞银集团以30亿瑞士法郎收购瑞士信贷银行
- 当前动态:美国联邦存款保险公司据悉将推进对硅谷银行的分拆计划
- 报道:塞纳里奥植物药膏在哪_塞纳里奥植物药膏
- 有一种叫云南的生活|华宁:玉荷花开 唇齿留香
- 天天即时看!WTT新加坡大满贯赛:国乒包揽五项冠军 孙颖莎、樊振东单打夺冠
- 【全球报资讯】市场上空军一号一般多少钱一双?空军一号鞋子质量怎么样?
- 全球热门:瑞银提出以最多10亿美元收购瑞士信贷 交易能否达成?
- 实时焦点:【有一种叫云南的生活】滇池绿道:让市民和游人共享健康美好生活
- 环球热点评!2023年五华区健身瑜伽进社区比赛举行
- 法国西南部遭遇严重干旱 蒙贝尔湖湖面缩减超80%
- 最新消息:瑞银提出以最高10亿美元价格收购瑞信
- 速讯:英国监管机构支持瑞银和瑞信的合并
- 重磅消息!篮协最新公告!姚明作出决定!感谢篮协!感谢CBA公司
- 高盛:美国中小银行或将收紧贷款 中小银行贷款业务收缩或将打击美国经济
- 全球通讯!银行业危机四伏 2008年场景再现?美国第一公民银行洽淡收购SVB
- 快资讯丨昆明市小板桥街道党工委:“建送融”助推新就业群体成为基层治理生力军
- 日本内阁府年度调查:七成受访者认为物价状况恶化
- 全球快看:昆明市太和街道党工委:党建述职“交答卷” 踔厉奋发“再赶考”