滑动是手指在屏幕上滑动的一种手势,已成为移动界面中主要的交互方式之一。从简单的翻看照片到删除邮件——滑动已替代了许多按钮,使操控更加自然。根据 Apple Human Interface Guidelines (2024),滑动手势是添击之后第二常用的手势,占移动应用中所有交互的22%。
主要内容
滑动(swipe)是用户将手指在屏幕上按某一方向移动,以启动某个操作的手势。与点击(短暂触摸)不同,滑动在整个手势过程中包含移动和与屏幕的接触。
滑动的历史始于2007年的第一款iPhone——“slide to unlock”解锁手势成为了移动界面的标志。如今,滑动被用于数千个应用中的导航、内容管理和信息组织。
根据UX Planet (2025),采用手势控制(包括滑动)的应用程序显示用户参与度高出18%。与按钮按压相比,滑动被视为更自然的操作,因为它模拟了物体的物理移动。
主要参数,用于确定手势是否为滑动:最小距离(通常30–50像素)、离直线的最大偏移(不超过15–20度)以及最大接触时间(倍蔀力)。如果手指在屏幕上停留时间过长,该手势将被分类为拖动(drag)或长按(long press)。
按移动方向,滑动可分为四种主要类型:向左、向右、向上和向下。每种类型都有其自己的用途和使用场景。
| 滑动类型 | 操作 | 使用示例 |
|---|---|---|
| 向左 | 删除、归档、隐藏 | 在Mail中删除邮件,在Tinder中隐藏 |
| 向右 | 确认、查看 | Tinder中的点赞,标记为“已读” |
| 向上 | 刷新、关闭 | 下拉刷新,滑动关闭面板 |
| 向下 | 返回导航、打开 | 在iOS中向下滑动返回,通知中心 |
水平滑动(向左/向右)最常用于管理单个元素——删除、归档、翻页。垂直滑动(向上/向下)——用于屏幕之间的导航和内容刷新。根据Material Design Guidelines (2024),水平滑动对右扫子更为便捷:用大拇指向左移动在右手上更自然。
双指和三指滑动用于高级操作。双指——在iPad上切换桌面,撤销操作(three-finger swipe)。三指——在某些设备上截图。然而,多指手势不够直觉,需要用户学习。
在iOS上,手势处理基于UIGestureRecognizer——一个抽象类,它分析触摸事件序列并判断它是否与某个特定手势匹配。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let swipeLeft = UISwipeGestureRecognizer(
target: self,
action: #selector(handleSwipe)
)
swipeLeft.direction = .left
view.addGestureRecognizer(swipeLeft)
}
@objc func handleSwipe(sender: UISwipeGestureRecognizer) {
print("向左滑动")
}
}
UISwipeGestureRecognizer支持方向(direction)和手指数(numberOfTouchesRequired)的配置。默认情况下需要一根手指和向右方向。要确定其他方向,需要显式设置direction: .left, .up, .down。
更高级别的API——支持滑动操作的UICollectionViewLayout。从iOS 11开始,表格和集合通过UISwipeActionsConfiguration支持内置的滑动操作,可以无需手动处理手势即可添加删除或归档按钮。
在Android上,滑动处理通过GestureDetector实现——该类分析MotionEvents并调用相应的回调方法。
class SwipeActivity : AppCompatActivity() {
private val swipeThreshold = 100
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
override fun onFling(
e1: MotionEvent, e2: MotionEvent,
velocityX: Float, velocityY: Float
): Boolean {
val dx = e2.x - e1.x
if (dx > swipeThreshold) {
println("向右滑动")
}
return true
}
})
}
}
GestureDetector中的onFling方法在用户快速滑动手指时被调用。它接收起始和结束坐标(e1, e2)以及移动速度(velocityX, velocityY)。要确定方向,需要比较X或Y轴上的坐标差异。
AndroidX库提供了更便捷的API:用于下拉刷新的ViewCompat.setSwipeRefreshLayout,以及在列表中实现滑动操作的RecyclerView与ItemTouchHelper。ItemTouchHelper可以添加带有视觉反馈的滑动功能——图标、背景颜色和动画。
在Web开发中,滑动处理使用Touch Events API事件(touchstart, touchmove, touchend)以及Hammer.js或Swiper.js等辅助库。
let startX = 0;
let startY = 0;
const threshold = 50;
element.addEventListener("touchstart", (e) => {
startX = e.touches[0].clientX;
startY = e.touches[0].clientY;
});
element.addEventListener("touchend", (e) => {
const dx = e.changedTouches[0].clientX - startX;
const dy = e.changedTouches[0].clientY - startY;
if (Math.abs(dx) > threshold) {
console.log(dx > 0 ? "向右滑动" : "向左滑动");
}
});
Touch Events API——浏览器中处理手势的原生方式。touchstart事件记录起始坐标,touchmove跟踪移动,touchend确定结果。阈值(threshold)过滤掉随机触摸。
根据Can I Use (2026),98%的浏览器支持Touch Events API。对于复杂的手势场景(多次滑动、方向识别),建议使用Hammer.js库,它抽象了低层处理并提供了清晰的API。
成功的UX模式随着移动界面多年的演变而形成。使用它们可以确保用户无需额外的学习即可理解手势的工作原理。
“Swipe to Delete”模式——最为常见。在列表项上向左滑动可打开删除按钮。在iOS(SwipeActionsConfiguration)和Android(ItemTouchHelper)上已标准化。用户期望向左滑动会删除或归档项目。
“Swipe to Go Back”模式——从屏幕左缘滑动以返回上一屏幕。在iPhone X之后成为iOS的标准。在Android上,类似的导航通过系统手势工作。在您的应用中不要与这种系统手势产生冲突。
“Pull to Refresh”模式——向下滑动以刷新内容。由Loren Brichter为Tweetie(2008)发明,现在已在数百万个应用中使用。在两个平台的标准组件中均有实现。
常见问题
滑动——手指快速移动并随后抬起。拖动——保持接触的缓慢移动。主要区别在于速度:滑动时速度阈值至关重要,而拖动时仅移动坐标重要。
iOS和Android使用约30–50像素的阈值。对于Web应用,建议使用40–60像素的阈值。较小的值会导致滚动时误触发,较大的值需要过宽的移动。
按方向确定手势优先级:水平滑动锁定垂直滚动,垂直滑动锁定水平滚动。在iOS上,使用UIScrollViewDelegate的gestureRecognizerShouldBegin方法管理优先级。
对于标准滑动(删除、返回)无需教学——用户已经熟悉。对于独特的手势(三指滑动、非标准方向),需要附带视觉演示的引导。
始终用按钮备份滑动操作。对于手抖的用户,将激活阈值增加到70–100像素,超时设为800毫秒。使用VoiceOver/TalkBack来声明可用的滑动操作。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。