在实际的移动应用程序交互方式中,最常见的就是滑动操作。像左右滑动切换页面,手指张开来放大图片等,都是由滑动操作来完成的。
微信小程序默认提供的相关事件如下:
触摸相关操作事件
tap对应点击操作,还提供了longtap来支持长按操作,这些都比较简单,就不多做讲述。
touchmove对应滑动操作,通过bindtouchmove即可响应滑动操作。
//wxml登录后复制//js Page({ handletouchmove: function(event) { console.log(event) }, })
当按住view标签并滑动鼠标时,会不停的触发滑动事件,直到放开鼠标,当鼠标移出view标签区域后依然会触发事件。
拖拽操作
通过监听滑动事件,可以实现一些实用的功能,比如用过iphone的用户都知道assistivetouch,一个桌面上的快捷按钮,可以将按钮拖动到桌面的任意位置。为了方便,这里就用一个圆形来代表该按钮。
//wxml登录后复制//wxss .ball { box-shadow:2px 2px 10px #AAA; border-radius: 20px; position: absolute; } //js Page({ handletouchmove: function(event) { console.log(event) }, })
视图跟随
好吧,按钮丑了点,这不是重点。拖拽操作的实现思路也很简单,当触发滑动事件时,event对象会包含当前触摸位置的坐标信息,可以通过event.touches[0].pageX和event.touches[0].pageY 来获取,为什么touches是数组呢,答案是为了支持多点触控(在电脑上不知道如何模拟多点触控)。接下来将按钮的位置设置为触摸位置,应该就能实现预期效果了,让我们试试看。
在Page中定义按钮的位置数据ballBottom和ballRight,并绑定到view的对应属性中。
//wxml登录后复制//js Page({ data: { ballTop: 0, ballLeft: 0, }, handletouchmove: function(event) { console.log(event) }, })
接下来在handletouchmove方法中更新按钮的位置数据
handletouchmove: function(event) { console.log(event) this.setData ({ ballTop: event.touches[0].pageY, ballLeft: event.touches[0].pageX, }); },登录后复制
运行发现基本可以实现效果,不过有两个问题,一是会将按钮拖出屏幕边缘,二是按钮始终在鼠标右下方。
接下来加入对屏幕边界的判断并对按钮位置进行修正。其中屏幕大小可以通过wx.getSystemInfo来获取。
完整代码如下:
Page({ data: { ballTop: 0, ballLeft: 0, screenHeight:0, screenWidth:0 }, onLoad: function () { //获取屏幕宽高 var _this = this; wx.getSystemInfo({ success: function (res) { _this.setData({ screenHeight: res.windowHeight, screenWidth: res.windowWidth, }); } }); }, handletouchmove: function(event) { console.log(event) let pageX = event.touches[0].pageX; let pageY = event.touches[0].pageY; //屏幕边界判断 if (pageX this.data.screenWidth - 30) return; if (pageY > this.data.screenHeight - 30) return; this.setData ({ ballTop: event.touches[0].pageY - 30, ballLeft: event.touches[0].pageX - 30, }); }, })登录后复制
再次运行,一切ok。
手势识别
通过处理滑动操作可以识别各种手势操作,如左右滑动等。思路也很简单,通过绑定touchstart和touchmove事件,然后对坐标信息进行识别计算即可(如current.PageX - last.PageX
//wxml登录后复制{{text}} //js Page({ data: { lastX: 0, lastY: 0, text : "没有滑动", }, handletouchmove: function(event) { console.log(event) let currentX = event.touches[0].pageX let currentY = event.touches[0].pageY console.log(currentX) console.log(this.data.lastX) let text = "" if ((currentX - this.data.lastX) 0)) text = "向右滑动" //将当前坐标进行保存以进行下一次计算 this.data.lastX = currentX this.data.lastY = currentY this.setData({ text : text, }); }, handletouchtart:function(event) { console.log(event) this.data.lastX = event.touches[0].pageX this.data.lastY = event.touches[0].pageY }, handletap:function(event) { console.log(event) }, })
运行程序,当向左滑动时会view会显示"向左滑动", 向右同理。
同时识别左右滑动和上下互动
有时候希望同时识别左右和上下滑动,可以通过比较X轴上的差值和Y轴上的差值,较大的差值为滑动方向。
handletouchmove: function(event) { console.log(event) let currentX = event.touches[0].pageX let currentY = event.touches[0].pageY let tx = currentX - this.data.lastX let ty = currentY - this.data.lastY let text = "" //左右方向滑动 if (Math.abs(tx) > Math.abs(ty)) { if (tx 0) text = "向右滑动" } //上下方向滑动 else { if (ty 0) text = "向下滑动" } //将当前坐标进行保存以进行下一次计算 this.data.lastX = currentX this.data.lastY = currentY this.setData({ text : text, }); },登录后复制
在实际应用中,当某种手势被触发后,在用户没有放开鼠标或手指前,会一直识别为该手势。比如当用户触发左滑手势后,这时再向下滑动,仍要按照左滑手势来处理。
可以定义一个标记来记录第一次识别到的手势,如果已识别出手势,后续的滑动操作就可以忽略,直到用户放开鼠标或手指。放开鼠标或手指操作可以通过绑定handletouchend事件来处理。
Page({ data: { lastX: 0, lastY: 0, text : "没有滑动", currentGesture: 0, }, handletouchmove: function(event) { console.log(event) if (this.data.currentGesture != 0){ return } let currentX = event.touches[0].pageX let currentY = event.touches[0].pageY let tx = currentX - this.data.lastX let ty = currentY - this.data.lastY let text = "" //左右方向滑动 if (Math.abs(tx) > Math.abs(ty)) { if (tx 0) { text = "向右滑动" this.data.currentGesture = 2 } } //上下方向滑动 else { if (ty 0) { text = "向下滑动" this.data.currentGesture = 4 } } //将当前坐标进行保存以进行下一次计算 this.data.lastX = currentX this.data.lastY = currentY this.setData({ text : text, }); }, handletouchtart:function(event) { console.log(event) this.data.lastX = event.touches[0].pageX this.data.lastY = event.touches[0].pageY }, handletouchend:function(event) { console.log(event) this.data.currentGesture = 0 this.setData({ text : "没有滑动", }); }, })登录后复制
多点触控
由于多点触控需要真机来测试,而我的appid还在申请中,只能延后讲解了。这里大概提下思路,比如手指张开的操作,可以分别判断两个触摸点的移动方向,比如靠左的触摸点向左滑动,靠右的触摸点向右滑动,即可判定为手指张开操作。
以上就是小程序开发之基础篇滑动操作(10)的详细内容,更多请关注慧达安全导航其它相关文章!
免责 声明
1、本网站名称:慧达安全导航
2、本站永久网址:https//www.huida178.com/
3、本站所有资源来源于网友投稿和高价购买,所有资源仅对编程人员及源代码爱好者开放下载做参考和研究及学习,本站不提供任何技术服务!
4、本站所有资源的属示图片和信息不代表本站的立场!本站只是储蓄平台及搬运
5、下载者禁止在服务器和虚拟机下进行搭建运营,本站所有资源不支持联网运行!只允许调试,参考和研究!!!!
6、未经原版权作者许可禁止用于任何商业环境,任何人不得擅作它用,下载者不得用于违反国家法律,否则发生的一切法律后果自行承担!
7、为尊重作者版权,请在下载24小时内删除!请购买原版授权作品,支持你喜欢的作者,谢谢!
8.若资源侵犯了您的合法权益,请持 您的版权证书和相关原作品信息来信通知我们!QQ:1247526623我们会及时删除,给您带来的不便,我们深表歉意!
9、如下载链接失效、广告或者压缩包问题请联系站长处理
10、如果你也有好源码或者教程,可以发布到网站,分享有金币奖励和额外收入!
11、本站资源售价只是赞助,收取费用仅维持本站的日常运营所需
12、因源码具有可复制性,一经赞助,不得以任何形式退款。
13、本文内容由网友自发贡献和站长收集,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系1247526623@qq.com
转载请注明出处: 慧达安全导航 » 小程序开发之基础篇滑动操作(10)
发表评论 取消回复