赞
踩
最近重新搭了个app,发现手机显示APP主界面时,沿着手机右边向左滑,会直接关闭应用,所以想搞个第一次提示,第二次退出app的效果。
结果搞出个复杂的东西,下面是两段代码。1:
- 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
方法中,我们根据时间间隔判断是否显示退出提示。
- 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
- }
- }
总的来说,这段代码的原理是通过使用 GestureDetector
和 SwipeGestureListener
来监听左滑手势,然后在满足条件时执行特定的逻辑。这样的设计使得代码更加模块化和易于理解。
- 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)
- }
这个就不用解释了吧。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。