完整的 BaseActivity 原生侧滑返回方案文档,基于 AndroidX + Kotlin + 原生手势返回,可直接在项目中使用。文档包含 概念说明、实现代码、配置说明和调整方法。
BaseActivity 原生侧滑返回完整文档
1️⃣ 功能概述
- 实现 从屏幕左边缘滑动返回上一页
- 完全原生,不依赖第三方库
- 支持 AndroidX
- 可在 BaseActivity 中统一配置,所有继承的 Activity 自动生效
- 可自定义触发区域宽度(edgeSize)和滑动阈值(swipeThreshold)
- 支持 退出动画(使用
finishAfterTransition+ Window ExitTransition)
2️⃣ 核心原理
-
手势检测:通过
onTouchEvent监听用户触摸事件 -
滑动判断条件:
- 用户从屏幕左边缘滑动
- 水平滑动距离大于阈值
- 水平位移大于垂直位移(避免误触上下滑动)
-
触发返回:
- 调用
finishAfterTransition()完成页面退出 - 可结合 Window ExitTransition 实现平滑滑出动画
- 调用
3️⃣ BaseActivity 示例代码
open class BaseActivity : AppCompatActivity() {
// 左边缘触发滑动区域(dp)
private val edgeSizeDp = 20
private val swipeThresholdDp = 100
private var startX = 0f
private var startY = 0f
private var edgeSize = 0
private var swipeThreshold = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 将 dp 转 px,保证不同屏幕一致
val density = resources.displayMetrics.density
edgeSize = (edgeSizeDp * density + 0.5f).toInt()
swipeThreshold = (swipeThresholdDp * density + 0.5f).toInt()
// 设置窗口退出动画(从右向左滑出)
window.enterTransition = null
window.exitTransition = android.transition.Slide(Gravity.END).apply {
duration = 200
}
}
override fun onTouchEvent(event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
startX = event.rawX
startY = event.rawY
}
MotionEvent.ACTION_UP -> {
val endX = event.rawX
val endY = event.rawY
val deltaX = endX - startX
val deltaY = endY - startY
// 条件:左边缘滑动 + 水平位移大于阈值 + 水平大于垂直位移
if (startX < edgeSize && deltaX > swipeThreshold && Math.abs(deltaX) > Math.abs(deltaY)) {
finishAfterTransition()
return true
}
}
}
return super.onTouchEvent(event)
}
}
4️⃣ 配置说明
| 参数 | 类型 | 默认值 | 作用 |
|---|---|---|---|
edgeSizeDp |
Int (dp) | 20 | 左边缘触发滑动返回的宽度 |
swipeThresholdDp |
Int (dp) | 100 | 滑动超过该距离才触发返回 |
window.exitTransition |
Transition | Slide(Gravity.END) | 页面退出动画,配合 finishAfterTransition() 使用 |
调整依据:
- 小屏手机:
edgeSizeDp = 15~20 - 大屏或平板:
edgeSizeDp = 20~30 - 页面有水平滑动控件(RecyclerView、ViewPager):避免误触 → 边缘区可设置小一点
5️⃣ 使用方法
- 所有 Activity 继承
BaseActivity:
class SecondActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_second)
}
}
- 路由跳转(例如 TheRouter)无需修改:
TheRouter.go("SecondActivity")
- 所有继承
BaseActivity的 Activity 自动支持左滑返回 - 手势触发后会带动画退出
6️⃣ 优化建议
-
动画效果:
- 可以自定义
Slide(Gravity.END)的duration或使用TransitionSet实现更复杂动画
- 可以自定义
-
滑动流畅度:
- 可结合
GestureDetector或MotionEvent.ACTION_MOVE实现页面跟随手指滑动(更接近 iOS 手势返回)
- 可结合
-
兼容性:
- 该方案兼容 AndroidX,API 21+
- 无需额外依赖库