当前位置:   article > 正文

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

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

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

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

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

  1. class SwipeGestureListener(private val context:Context,private val onSwipeLeft:()->Unit)
  2. :GestureDetector.SimpleOnGestureListener() {
  3. override fun onFling(
  4. e1: MotionEvent,
  5. e2: MotionEvent,
  6. velocityX: Float,
  7. velocityY: Float
  8. ): Boolean {
  9. Log.e("滑动","onFling")
  10. val deltaX =e2.x -e1.x
  11. val deltaY =e2.y -e1.y
  12. if (Math.abs(deltaX)>Math.abs(deltaY) && deltaX<0){
  13. onSwipeLeft.invoke()
  14. return true
  15. }
  16. return false
  17. }
  18. // override fun onScroll(
  19. // e1: MotionEvent,
  20. // e2: MotionEvent,
  21. // distanceX: Float,
  22. // distanceY: Float
  23. // ): Boolean {
  24. // Log.e("滑动","onScroll")
  25. // // 判断手势为从右到左的滑动,并且滑动距离较大
  26. // if (distanceX < 0 && Math.abs(distanceX) > Math.abs(distanceY)) {
  27. // onSwipeLeft.invoke()
  28. // return true
  29. // }
  30. //
  31. // return false
  32. // }
  33. }
  34. /**
  35. * AppCompatActivity的扩展函数。
  36. */
  37. fun AppCompatActivity.setupSwipeGesture(
  38. view: View,
  39. onSwipeLeft: () -> Unit
  40. ):GestureDetector{
  41. val gestureDetector =GestureDetector(this,SwipeGestureListener(this,onSwipeLeft))
  42. view.setOnTouchListener{_,event->
  43. gestureDetector.onTouchEvent(event)
  44. }
  45. return gestureDetector
  46. }

理解这段代码需要考虑两个主要部分: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 方法中,我们根据时间间隔判断是否显示退出提示。

  1. class MainActivity : AppCompatActivity() {
  2. private lateinit var gestureDetector: GestureDetector
  3. private var lastSwipeTime: Long = 0
  4. override fun onCreate(savedInstanceState: Bundle?) {
  5. super.onCreate(savedInstanceState)
  6. setContentView(R.layout.activity_main)
  7. gestureDetector = setupSwipeGesture {
  8. handleLeftSwipe()
  9. }
  10. }
  11. private fun handleLeftSwipe() {
  12. val currentTime = System.currentTimeMillis()
  13. // 如果两次左滑的时间间隔小于2秒,且次数为1,显示提示
  14. if (currentTime - lastSwipeTime < 2000) {
  15. showExitToast()
  16. finish()
  17. }
  18. // 更新上一次左滑时间
  19. lastSwipeTime = currentTime
  20. }
  21. }

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

2.老办法onKeyDown,简单好用

  1. override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
  2. if (keyCode == KeyEvent.KEYCODE_BACK && event?.action == KeyEvent.ACTION_DOWN){
  3. if (System.currentTimeMillis() - lastSwipeTime > 2000) {
  4. lastSwipeTime = System.currentTimeMillis()
  5. "再按一次退出".showToast(this)
  6. Log.e("","再按一次退出")
  7. } else {
  8. finish()
  9. }
  10. return true
  11. }
  12. return super.onKeyDown(keyCode, event)
  13. }

这个就不用解释了吧。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/657565
推荐阅读
相关标签
  

闽ICP备14008679号