Skip to content

17.3_根据滑动距离和速度决定卡片飞出动画

根据滑动距离和速度决定卡片飞出动画,是卡片式UI交互中至关重要的一环。它决定了用户滑动卡片时,卡片是应该飞出屏幕,还是应该复位。这个决策过程需要综合考虑用户的滑动操作,从而提供流畅且直观的用户体验。🚀

滑动距离阈值

首先,你需要设定一个滑动距离的阈值。这个阈值代表了用户至少需要滑动多远,卡片才会被认为是“想要丢弃”的。如果滑动距离小于这个阈值,卡片就会复位。这个阈值通常是卡片宽度或高度的一定比例,例如:

swift
let flyOutDistanceThreshold = cardWidth * 0.6

这意味着用户需要滑动超过卡片宽度的60%,卡片才会被判定为飞出。你可以根据实际情况调整这个比例,以达到最佳的用户体验。

滑动速度阈值

除了滑动距离,滑动速度也是一个重要的考量因素。即使滑动距离没有达到阈值,如果滑动速度足够快,也应该让卡片飞出。这模拟了用户快速滑动卡片,想要快速丢弃的行为。速度阈值可以这样定义:

swift
let flyOutVelocityThreshold: CGFloat = 800

这意味着如果用户的滑动速度超过每秒800个像素,卡片就会飞出。速度的单位是像素/秒。

动画实现

当决定卡片需要飞出时,你需要创建一个飞出动画。这个动画应该让卡片以一定的速度和角度飞出屏幕。你可以使用UIView.animate(withDuration:animations:)来实现这个动画。动画的关键在于计算出卡片飞出的目标位置和旋转角度。

  • 目标位置: 目标位置应该在屏幕之外,确保用户看不到卡片飞出的最终位置。
  • 旋转角度: 可以根据滑动方向和速度,给卡片添加一个旋转角度,增加动画的真实感。
swift
UIView.animate(withDuration: 0.3, animations: {
    card.center = CGPoint(x: endPointX, y: endPointY)
    card.transform = CGAffineTransform(rotationAngle: rotationAngle)
}) { _ in
    card.removeFromSuperview()
}

复位动画

如果滑动距离和速度都没有达到阈值,你需要创建一个复位动画,让卡片平滑地回到初始位置。可以使用UIView.animate(withDuration:usingSpringWithDamping:initialSpringVelocity:animations:)来实现一个带有弹簧效果的复位动画,让动画更加自然。

swift
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.8, options: .curveEaseInOut, animations: {
    card.center = originalCenter
    card.transform = .identity
}, completion: nil)

综合判断

将滑动距离和速度结合起来判断,可以提供更智能的卡片交互体验。例如,可以设置:

  1. 如果滑动距离超过阈值,则飞出。
  2. 如果滑动速度超过阈值,也飞出。
  3. 否则,复位。
swift
if translation.x > flyOutDistanceThreshold || velocity.x > flyOutVelocityThreshold {
    // 飞出动画
} else {
    // 复位动画
}

通过调整滑动距离和速度的阈值,以及动画的参数,你可以创建出各种各样的卡片交互效果。 记住,不断尝试和调整是关键!🎉

本站使用 VitePress 制作