范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

用JavaScript实现手势库手势逻辑前端组件化

  Start 事件
  首先我们会触发一个 start 事件,也就是当我们手指触摸到屏幕时第一个触发的事件。这时会有三种情况:
  手指松开
  会触发 end 事件,这样就构成一个 tap 点击的行为
  通过监听 end 事件来实现即可
  手指拖动超过 10 px
  这种就是 pan start 拖动的行为
  我们可以在 move 事件判断当前与上一个触点的距离
  手指停留在当前位置超过 0.5s
  这种就是 press start 按压的行为
  我们可以添加一个 setTimeout 来实现
  Press 事件
  所以我们第一步就是在  start   函数中加入一个  setTimout   的 handler 处理程序。 let handler;  let start = point => {   handler = setTimeout(() => {     console.log("presss ");   }, 500); };
  一般来说 press 是我们比较常见的一个行为。但是实际上这里是 press start 事件,后面还会跟随着一个 press end 的事件。我们也可以统称这个为 press 事件,然后这个手势库的使用者只需要监听这个 press 事件即可,极少的情况下是需要监听 press end 事件的。
  这里我们需要注意的是,当我们触发其他的事件的时候,这个 500 毫秒的 setTimout 是有可能会被取消掉的。所以我们需要给这段逻辑一个 handler,并且放在全局作用域中,让其他事件可以获取到这个变量,并且可使用它取消掉这个处理逻辑。
  Pan 事件
  接下来我们就去监听移动 10px 的  pan   事件,这里就需要我们记录一开始用户触摸屏幕时的 x 和 y 坐标,当用户移动手指的时候,持续计算新移动到的位置与初始位置的距离。如果这个距离超过了 10px 就可以触发我们的  pan start   的事件了。
  所以首先我们需要在 start 函数中加入  startX   和  startY   的坐标记录,这里要注意的是,因为这两个值都是会在多个地方被使用的,所以也是需要在全局作用域中声明。
  在代码中我们一般都会尽量避免使用根号运算,因为根号运算会对性能有一定的影响。我们知道最终要判断的是直径距离是否是大于一个固定的 10px。那就是说 z = 10,而 z 的二次幂就是 100,所以我们直接判断这个直径距离是否大于 100 即可。
  这里还有一个需要注意的,就是当我们手指移动超过 10px 之后,如果我们手指没有离开屏幕而是往回移动了,这样的话我们距离起点已经不够 10px了。但是这个其实也是算 pan 事件,因为我们确实有移动超过 10px 距离,超过这个距离之后所有的移动都是属于 pan 事件。
  所以我们需要一个 isPan 的状态,第一次移动超出 10px 的时候,就会触发 pan-start 事件,并且把 isPan 置为 true,而后面的所有移动都会触发 pan 事件。
  根据我们上面讲到的 press 事件,如果我们按下手指后 0.5 秒内出现了移动,那么 press 事件就会被取消。所以这里我们就需要 clearTimeout 把 pressstart 的 handler 给清楚掉。let handler; let startX, startY; let isPan = false;  let start = point => {   (startX = point.clientX), (startY = point.clientY);    isPan = false;    handler = setTimeout(() => {     console.log("pressstart");   }, 500); };  let move = point => {   let dx = point.clientX - startX,     dy = point.clientY - startY;    let d = dx ** 2 + dy ** 2;    if (!isPan && d > 100) {     isPan = true;     console.log("pan-start");     clearTimeout(handler);   }    if (isPan) {     console.log(dx, dy);     console.log("pan");   } };Tap 事件
  Tap 的这个逻辑我们可以在 end 事件里面去检查。首先我们默认有一个 isTap 等于 true 的状态,如果我们触发了 pan 事件的话,那就不会去触发 tap 的逻辑了,所以 tap 和 pan 是互斥的关系。但是为了不让它们变得很耦合,所以我们不使用原有的 isPan 作为判断状态,而是另外声明一个 isTap 的状态来记录。
  这里我们 tap 和 pan 都有单独的状态,那么我们 press 也不例外,所以也给 press 加上一个 isPress 的状态,它的默认值是 false。如果我们 0.5 秒的定时器被触发了,isPress 也就会变成 true。
  既然我们给每个事件都加入了状态,那么这里我们就给每一个事件触发的时候设置好这些状态的值。
  press 时
  isTap = false
  isPan = false
  isPress = true
  pan 时
  isTap = false
  isPan = true
  isPress = false
  tap 时
  isTap = true
  isPan = false
  isPress = false
  如果我们发现用户没有移动,也没有按住触屏超过 0.5 秒,当用户离开屏幕时就会调用 end 函数,这个时候我们就可以认定用户的操作就是 tap。这里我们要注意的是,我们 press 的 0.5 秒定时器是没有被关闭的,所以我们在 isTap 的逻辑中需要 clearTimeout(handler)。
  说到取消 press 定时器,其实我们 handler 的回调函数中,也需要做一个保护代码逻辑,在触发了 press-start 之后,我们需要保证每次点击屏幕只会触发一次,所以在 setTimout 的回调函数中的最后,我们需要加上 handler = null。这样只要 press-start 触发了,就不会再被触发。let handler; let startX, startY; let isPan = false,   isPress = false,   isTap = false;  let start = point => {   (startX = point.clientX), (startY = point.clientY);    isPan = false;   isTap = true;   isPress = false;    handler = setTimeout(() => {     isPan = false;     isTap = false;     isPress = true;     console.log("press-start");     handler = null;   }, 500); };  let move = point => {   let dx = point.clientX - startX,     dy = point.clientY - startY;    let d = dx ** 2 + dy ** 2;    if (!isPan && d > 100) {     isPan = true;     isTap = false;     isPress = false;     console.log("pan-start");     clearTimeout(handler);   }    if (isPan) {     console.log(dx, dy);     console.log("pan");   } };  let end = point => {   if (isTap) {     console.log("tap");     clearTimeout(handler);   } };
  End 事件
  到了最后这里我们要处理的就是所有的最后我们需要在 cancel 事件触发的时候,清楚掉 press 事件的 setTimeout。既然我们的操作被打断了,那也不可能会触发我们的长按事件了。 // 加入 cancel let cancel = point => {   clearTimeout(handler);   console.log("cancel"); };
  我们除了   flick   的逻辑,我们已经完成所有手势库里面的事件了。并且也能正确的区分这几种手势操作了。
  作者:三钻
  平台:csdn

抚州五菱宏光V欢迎垂询,降价0。1万元汽车报价早知道五菱汽车抚州国鼎销售中心店,五菱宏光V限时特惠大酬宾,10月31日10月31日限时特惠0。1万元,有购车意向的朋友不妨亲自去试驾一下,店铺地址抚州市文昌大道与迎宾大道华为新款轻薄本MateBookX发布,机身重量仅有1KG!悬浮全面屏Hello大家好,我是兼容机之家的小牛。今天下午华为举行了华为MateBook系列新品发布会,带来了最新款的MateBookX,亮点颇多,各位花粉肯定会很满意,就跟着小牛来看一看新抚州宝骏E200最高优惠0。05万元,欢迎到店赏车今天给大家推荐一款车它就是宝骏E200,特别适合日常使用,据悉五菱汽车抚州国鼎销售中心店11月03日11月03日限时回馈用户,最高优惠0。91,对宝骏E200感兴趣的朋友不妨亲自体抚州五菱荣光EV让利促销,购车优惠0。05万元,欢迎垂询谈及理想生活,多少都会带有未来的憧憬,舒适科技感的生活,而现实中,你需要一台五菱荣光EV,为你的现实生活增添舒适与便利,当前五菱汽车抚州国鼎销售中心店购车优惠0。05万元,活动时间抚州五菱之光最高优惠1。55,欢迎到店赏车心心念念的五菱之光,等了这么久终于有优惠了,小编打听到五菱汽车抚州国鼎销售中心店11。0311。03降价0。05万元,这么好的机会朋友们是不是也和小编一样迫不及待的想到店去感受一下抚州五菱宏光PLUS让利促销,直降0。05万元,欢迎垂询汽车报价早知道五菱汽车抚州国鼎销售中心店,五菱宏光PLUS限时特惠大酬宾,11月03日11月03日购车优惠0。85,有购车意向的朋友不妨亲自去试驾一下,店铺地址抚州市文昌大道与迎宾抚州宝骏730店内购车优惠3。13,欢迎到店鉴赏本周宝骏730最新报价五菱汽车抚州国鼎销售中心店即日起到11月03日限时促销,最高优惠0。2万元,如此优惠的降幅,大家可千万不要错过,店铺地址抚州市文昌大道与迎宾大道交叉口促销时间惊喜福利到,抚州宝骏310最高优惠3。91,期待您的光临观望很久的宝骏310终于降价了,五菱汽车抚州国鼎销售中心店11月02日11月02日,店铺活动购车直降3。91,真是迫不及待的想要到店一睹宝骏310的风采啊促销时间2021年11月0城市通勤神器宝骏KiWiEV,用车成本也太香了我学的是设计专业,毕业后就回老家城市发展了,自己接单做室内设计的活。这个工作的收入不算少,就是得经常东跑一下西跑一下,坐公交车又累又浪费时间,就准备买一辆合适的代步车,方便平常出门索尼PS5将于次月在印度正式发售!即将开始预定,国行指日可待Hello大家好,我是兼容机之家的小牛。相信各位小伙伴们心系于索尼PS5早已上市,却因为产量的原因,导致市场价格久久下不来而头疼吧?而就在元旦索尼印度官方发布了一则消息,便让我们来抚州五菱之光购车优惠0。05万元,欢迎莅临赏鉴本周五菱之光最新报价五菱汽车抚州国鼎销售中心店11。0211。02限时促销,限时特惠1。55,如此优惠的降幅,大家可千万不要错过,店铺地址抚州市文昌大道与迎宾大道交叉口促销时间20
被冷落的骁龙888旗舰,256GB6400万双主摄,上市4个月跌至2998元谈起性价比手机,你首先会想起谁,我想很多人第一时间都会想到小米和荣耀,毕竟早些年这两个品牌都主打性价比,推出了很多脍炙人口的性价比神机,比如荣耀20小米9荣耀30红米K30荣耀9X户外游玩新高度,卡旺达户外电源瞬间提升生活幸福指数每天在水泥钢筋森林里奔波劳碌,对大自然的向往会日益增加。越来越多的人选择自驾游释放工作的压力,远离城市的喧嚣,在草丛里席地而坐,或看看书或听听音乐或冲上一杯咖啡品味生活。饿了就蒸一品牌三星手机将取消广告谷歌Pixel宣布将不再附送充电器截至目前,手机厂商宣布取消附送充电器的有苹果小米三星华为魅族等,现在又有一家宣布将不再附送手机充电器,它就是谷歌。就在三天前,谷歌发布了中低端新机谷歌Pixel5a,其尚且在包装盒完全体SONY索尼WI1000XM2入耳式主动降噪耳机体验测评报告样机来源自主采购样机类型市售量产版文章狗鞭图集狗鞭这两年降噪耳机发展的是如火如荼,尤其是TWS。在前两年还如日中天的挂脖蓝牙耳机,现在也跌落神坛,仿佛和智能手机的小屏旗舰一样,成为品牌手机已经很难见到千元以下机型了,竟给了山寨机复活的生机关于山寨机的假货的话题,在直播带货火热后,又被爆料出来了!这些手机竟然开始山寨起来小米苹果华为等一些品牌手机了,甚至几百块就能买到和华为mate40系列小米11UltraiPhon华为P50Pro大揭秘细数那些会影响手机使用体验的手机壳膜随着P50系列手机发布,市场上P50系列的手机壳膜各式各样,款式新颖,牢牢抓住了大家的心,不买?不存在的!但是,大家购买时一定要注意啦,不是所有的配件都适合P50系列手机,有的保护极米投影怎么安装第三方软件?免U盘,仅用手机快速安装很多人买了极米投影仪,在使用过程中没有找到自己喜欢的软件,想另外安装其它软件该怎么办呢?下面以当贝市场为例,教你简单安装第三方应用市场。1。先在手机端下载一个极米手机版,将手机和极可惜那些被前置摄像头,贬低整体颜值的好手机据湘行观察发现,最近一段时间发布不少新机,有的手机各方面配置真的很好,但遇到完美主义者,看到有些手机前置摄像头时,瞬间就没有了购买欲望,真是成也摄像头,败也是摄像头!华为P50,是仅需一千多块,旗舰手机的配置一个不落随着870,888系列处理器手机的退出,865逐渐沦为二手机,前一两年的855开始成为二手市场中的香饽饽。原本两三千甚至三四千块的855旗舰机型,现在在二手市场一般都能以一千多块的2000左右的游戏手机推荐,喜欢玩游戏的可以看看如果你只有2000多的预算,又喜欢打游戏,那么这款手机,你绝对不能错过,机身正面配备了一块6。57英寸LCD单打孔直屏,直屏对于手游玩家有多重要不用我多说了吧!并且这块屏幕还支持1售价6399元,现货的华为5G旗舰开售,网友没白等在众多的国产手机品牌之中,华为应该是最给予我们带来惊喜的一个品牌吧!但是近两年的华为却是遇到了难处,虽说有着自研手机芯片的实力,但无法找到代工工厂却比较令人恼火,因此也就形成了华为