时间: 2020-08-23|53次围观|0 条评论

效果

用户可以通过拖拽卡片,来将其移除。除此之外还添加了大量的交互式动画。

微信小程序-类似探探的卡片拖拽切换插图
效果图

实现

为了提升运行速度,采用了只生成两张卡片,并将其不断复用的方法。

当用户点击卡片式,记录此次的点击位置,并将这张卡片变小,产生按压的效果。

  viewTouchInside: function (event) {    var that = this    var pointX = event.touches[0].clientX    var pointY = event.touches[0].clientY    that.setData({      startX: pointX,      startY: pointY    })    var animation = wx.createAnimation({      duration: 100,      timingFunction: 'ease-out',    })    animation.scale(0.9).step()    if (that.data.isFirstCard == true) {      that.setData({        animation1: animation.export()      })    } else {      that.setData({        animation2: animation.export()      })    }  }

当用户拖拽卡片时,卡片会随着手指移动,并旋转。下方的卡片也会逐渐从透明度为0的状态显现出来。

viewDidMove: function (event) {        var that = this    var pointX = event.touches[0].clientX    var pointY = event.touches[0].clientY    var widthCenter = that.data.windowWidth / 2    var heightCenter = that.data.windowHeight / 2    var perX = (pointX - that.data.startX) / widthCenter    var perY = (pointY - that.data.startY) / heightCenter    var maxPer = (Math.abs(perX) > Math.abs(perY)) ? Math.abs(perX) : Math.abs(perY)    var animationOpacity = wx.createAnimation({      duration: 100,      timingFunction: 'ease-out',    })    animationOpacity.opacity(maxPer).step()    var animationRotate = wx.createAnimation({      duration: 100,      timingFunction: 'ease-out',    })    animationRotate.scale(0.9).rotate(perX * 20).step()    var x = marginHori + pointX - that.data.startX    var y = marginVerti + pointY - that.data.startY    if (that.data.isFirstCard == true) {      that.setData({        left1: x,        top1: y      })      that.setData({        animation1: animationRotate.export(),        animation2: animationOpacity.export()      })    } else {      that.setData({        left2: x,        top2: y      })      that.setData({        animation1: animationOpacity.export(),        animation2: animationRotate.export(),      })    }  }

当用户手指离开卡片时,判断是否要进行移除卡片操作。如果需要,则根据卡片的方位移除该卡片,否则将卡片回归原位。

viewTouchUpDownInside: function (event) {    var that = this    var endX = event.changedTouches[0].clientX    var endY = event.changedTouches[0].clientY    var distanceX = endX - that.data.startX    var distanceY = endY - that.data.startY    if (distanceX > 93.75) {      that.removeCard('right')    } else if (distanceX < -93.75) {      that.removeCard('left')    } else if (distanceY < -100) {      that.removeCard('up')    } else if (distanceY > 100) {      that.removeCard('down')    }    if (distanceX < 93.75 && distanceX > -93.75 && distanceY > -150 && distanceY < 150) {      if (that.data.isFirstCard == true) {        that.setData({          top1: marginVerti,          left1: marginHori        })      } else {        that.setData({          top2: marginVerti,          left2: marginHori        })      }    }    var animation = wx.createAnimation({      duration: 100,      timingFunction: 'ease-out',    })    animation.scale(1).step()    if (that.data.isFirstCard == true) {      that.setData({        animation1: animation.export()      })    } else {      that.setData({        animation2: animation.export()      })    }    if (that.data.data.length - that.data.count < 5) {      that.requestMenu()    }  }

以下是移除卡片操作,首先先将卡片移除屏幕,随后再将数据重新填充,回归原位,实现复用机制。

removeCard: function (direction) {    var that = this    var animation = wx.createAnimation({      duration: 250,      timingFunction: 'linear',    })    if (direction == 'right') {      animation.translateX(400).rotate(45).opacity(0).step()      animation.translateX(0).rotate(0).step()    } else if (direction == 'left') {      animation.translateX(-400).rotate(-45).opacity(0).step()      animation.translateX(0).rotate(0).step()    } else if (direction == 'up') {      animation.translateY(-400).opacity(0).step()      animation.translateY(0).step()    } else if (direction == 'down') {      animation.translateY(400).opacity(0).step()      animation.translateY(0).step()    }        if (that.data.isFirstCard == true) {      that.setData({        animation1: animation.export(),        count1: that.data.count1 + 2,        count: that.data.count + 1,        name1: that.data.data[that.data.count1 + 2]["name"],        isLike1: that.data.data[that.data.count1 + 2]["is_like"],        location1: that.data.data[that.data.count1 + 2]["location"],        isFirstCard: false      })      setTimeout(function () {        that.setData({          top1: marginVerti,          left1: marginHori        })      }.bind(that), 250)    } else {      that.setData({        animation2: animation.export(),        count2: that.data.count2 + 2,        count: that.data.count + 1,        name2: that.data.data[that.data.count2 + 2]["name"],        isLike2: that.data.data[that.data.count2 + 2]["is_like"],        location2: that.data.data[that.data.count2 + 2]["location"],        isFirstCard: true      })      setTimeout(function () {        that.setData({          top2: marginVerti,          left2: marginHori        })      }.bind(that), 100)      that.setImgURL()    }  },

源码

作者

文章转载于:https://www.jianshu.com/p/7d6db33857d6

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《微信小程序-类似探探的卡片拖拽切换
   

还没有人抢沙发呢~