完整的 BaseActivity 原生侧滑返回方案文档,基于 AndroidX + Kotlin + 原生手势返回,可直接在项目中使用。文档包含 概念说明、实现代码、配置说明和调整方法


BaseActivity 原生侧滑返回完整文档

1️⃣ 功能概述

  • 实现 从屏幕左边缘滑动返回上一页
  • 完全原生,不依赖第三方库
  • 支持 AndroidX
  • 可在 BaseActivity 中统一配置,所有继承的 Activity 自动生效
  • 可自定义触发区域宽度(edgeSize)和滑动阈值(swipeThreshold)
  • 支持 退出动画(使用 finishAfterTransition + Window ExitTransition)

2️⃣ 核心原理

  1. 手势检测:通过 onTouchEvent 监听用户触摸事件

  2. 滑动判断条件

    • 用户从屏幕左边缘滑动
    • 水平滑动距离大于阈值
    • 水平位移大于垂直位移(避免误触上下滑动)
  3. 触发返回

    • 调用 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️⃣ 使用方法

  1. 所有 Activity 继承 BaseActivity
class SecondActivity : BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
    }
}
  1. 路由跳转(例如 TheRouter)无需修改:
TheRouter.go("SecondActivity")
  • 所有继承 BaseActivity 的 Activity 自动支持左滑返回
  • 手势触发后会带动画退出

6️⃣ 优化建议

  1. 动画效果

    • 可以自定义 Slide(Gravity.END)duration 或使用 TransitionSet 实现更复杂动画
  2. 滑动流畅度

    • 可结合 GestureDetectorMotionEvent.ACTION_MOVE 实现页面跟随手指滑动(更接近 iOS 手势返回)
  3. 兼容性

    • 该方案兼容 AndroidX,API 21+
    • 无需额外依赖库