网站产品内页设计,蚂蜂窝网站分析,安徽省建设厅网站张天培,广东省网站集约化建设最近重新搭了个app#xff0c;发现手机显示APP主界面时#xff0c;沿着手机右边向左滑#xff0c;会直接关闭应用#xff0c;所以想搞个第一次提示#xff0c;第二次退出app的效果。
结果搞出个复杂的东西#xff0c;下面是两段代码。1:
1:GestureDetector扩展函数。其…最近重新搭了个app发现手机显示APP主界面时沿着手机右边向左滑会直接关闭应用所以想搞个第一次提示第二次退出app的效果。
结果搞出个复杂的东西下面是两段代码。1:
1:GestureDetector扩展函数。其实这个我觉得自己写的挺好在一些不是系统级的滑动场景下应该有用。但时在返回退出这个需求上无法监听实现效果。。。
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.xval deltaY e2.y -e1.yif (Math.abs(deltaX)Math.abs(deltaY) deltaX0){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: GestureDetectorprivate var lastSwipeTime: Long 0override 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 来监听左滑手势然后在满足条件时执行特定的逻辑。这样的设计使得代码更加模块化和易于理解。
2.老办法onKeyDown简单好用 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)}
这个就不用解释了吧。