android 手机主界面侧滑退出app问题

最近重新搭了个app,发现手机显示APP主界面时,沿着手机右边向左滑,会直接关闭应用,所以想搞个第一次提示,第二次退出app的效果。

结果搞出个复杂的东西,下面是两段代码。1:

1:GestureDetector+扩展函数。其实这个我觉得自己写的挺好,在一些不是系统级的滑动场景下应该有用。但时在返回退出这个需求上无法监听,实现效果。。。

Kotlin 复制代码
class SwipeGestureListener(private val context:Context,private val onSwipeLeft:()->Unit)
    :GestureDetector.SimpleOnGestureListener() {

    override fun onFling(
        e1: MotionEvent,
        e2: MotionEvent,
        velocityX: Float,
        velocityY: Float
    ): Boolean {
        Log.e("滑动","onFling")
        val deltaX =e2.x -e1.x
        val deltaY =e2.y -e1.y
        if (Math.abs(deltaX)>Math.abs(deltaY) && deltaX<0){
            onSwipeLeft.invoke()
            return true
        }
       return false
    }

//    override fun onScroll(
//        e1: MotionEvent,
//        e2: MotionEvent,
//        distanceX: Float,
//        distanceY: Float
//    ): Boolean {
//        Log.e("滑动","onScroll")
//        // 判断手势为从右到左的滑动,并且滑动距离较大
//        if (distanceX < 0 && Math.abs(distanceX) > Math.abs(distanceY)) {
//            onSwipeLeft.invoke()
//            return true
//        }
//
//        return false
//    }

}

/**
 * AppCompatActivity的扩展函数。
 */
fun AppCompatActivity.setupSwipeGesture(
    view: View,
    onSwipeLeft: () -> Unit
):GestureDetector{
    val gestureDetector =GestureDetector(this,SwipeGestureListener(this,onSwipeLeft))

    view.setOnTouchListener{_,event->

        gestureDetector.onTouchEvent(event)
    }
    return gestureDetector
}

理解这段代码需要考虑两个主要部分:SwipeGestureListener 类和 setupSwipeGesture 扩展函数。

首先,SwipeGestureListener 类是一个实现了 GestureDetector.SimpleOnGestureListener 的监听器,用于处理左滑手势。它有一个构造函数,接受一个 Context 和一个 lambda 表达式 onSwipeLeft: () -> Unit。在 onFling 方法中,我们检测手势为向左滑动,并在满足条件时调用传入的 onSwipeLeft lambda 表达式。

接下来,我们有一个扩展函数 setupSwipeGesture,它是一个在 AppCompatActivity 上定义的扩展函数。这个函数接受一个 lambda 表达式 onSwipeLeft: () -> Unit,并返回一个 GestureDetector 对象。在这个函数中,我们创建了一个 SwipeGestureListener 实例,并将传入的 onSwipeLeft lambda 表达式作为参数传递。然后,我们设置 onTouchListener,并在其中调用 gestureDetector.onTouchEvent(event),以处理触摸事件。

最后,在 MainActivity 中,我们在 onCreate 方法中调用了 setupSwipeGesture,并传入了一个处理左滑的 lambda 表达式 handleLeftSwipe。在 handleLeftSwipe 方法中,我们根据时间间隔判断是否显示退出提示。

Kotlin 复制代码
class MainActivity : AppCompatActivity() {

    private lateinit var gestureDetector: GestureDetector
    private var lastSwipeTime: Long = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        gestureDetector = setupSwipeGesture {
            handleLeftSwipe()
        }
    }

    private fun handleLeftSwipe() {
        val currentTime = System.currentTimeMillis()

        // 如果两次左滑的时间间隔小于2秒,且次数为1,显示提示
        if (currentTime - lastSwipeTime < 2000) {
            showExitToast()
            finish()
        }

        // 更新上一次左滑时间
        lastSwipeTime = currentTime
    }
}

总的来说,这段代码的原理是通过使用 GestureDetectorSwipeGestureListener 来监听左滑手势,然后在满足条件时执行特定的逻辑。这样的设计使得代码更加模块化和易于理解。

2.老办法onKeyDown,简单好用

Kotlin 复制代码
    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KeyEvent.KEYCODE_BACK && event?.action == KeyEvent.ACTION_DOWN){
            if (System.currentTimeMillis() - lastSwipeTime > 2000) {

                lastSwipeTime = System.currentTimeMillis()
                "再按一次退出".showToast(this)
                Log.e("","再按一次退出")
            } else {
                finish()
            }
            return true
        }
        return super.onKeyDown(keyCode, event)
    }

这个就不用解释了吧。

相关推荐
程序员-珍1 小时前
报错下载android sdk失败
android·java
齊家治國平天下3 小时前
AAOS 电源管理深度解析:休眠/唤醒/功耗优化
android·车载系统·aaos·aosp·电源管理·休眠唤醒·carpowermanager
Xzaveir3 小时前
企业号码展示不可观测怎么办:状态机、拨测事件与异常回放
android·人工智能
2501_916007473 小时前
iOS和macOS应用程序性能分析和优化工具使用综合指南
android·macos·ios·小程序·uni-app·iphone·webview
黄林晴4 小时前
Nearby Connections 重大变更:不再自动开启 Wi-Fi / 蓝牙,适配指南
android
恋猫de小郭4 小时前
Flutter 全新真 3D 实现,用 flutter_scene 能开发一个「我的世界」
android·前端·flutter
HLC++17 小时前
Linux的进程间通信
android·linux·服务器
爱笑鱼20 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android
爱笑鱼21 小时前
Binder(一):一次方法调用,究竟怎样跨进程执行?
android
btown1 天前
Kotlin 版 MyBatis-Plus 查询优雅解决方案
kotlin