当前位置: 首页 > news >正文

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

最近重新搭了个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) && 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: 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}
}

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

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)}

这个就不用解释了吧。

相关文章:

  • 测试bug分析
  • Anylogic Pro 8.8.x for Mac / for Linux Crack
  • 西北大学844计算机类考研-25级初试高分总攻略
  • 探究element-ui 2.15.8中<el-input>的keydown事件无效问题
  • 009:vue结合el-table实现表格行拖拽排序(基于sortablejs)
  • 微软发布安卓版Copilot,可免费使用GPT-4、DALL-E 3
  • 如何将语音版大模型AI接入自己的项目里(语音ChatGPT)
  • 计算机视觉与自然语言处理(Open AI)
  • 12月27日,每日信息差
  • 第四章 Consul服务注册与发现
  • Selenium库和ChromeDriver谷歌驱动最新版安装
  • 面试经典150题(50-53)
  • 垃圾收集器与内存分配策略
  • linux用户态与内核态通过字符设备交互
  • Appium+python自动化(二)- 环境搭建—下(超详解)
  • [译]Python中的类属性与实例属性的区别
  • 【Linux系统编程】快速查找errno错误码信息
  • 【React系列】如何构建React应用程序
  • 【面试系列】之二:关于js原型
  • IP路由与转发
  • JS+CSS实现数字滚动
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • MobX
  • Mysql数据库的条件查询语句
  • SQLServer之索引简介
  • 彻底搞懂浏览器Event-loop
  • 从0到1:PostCSS 插件开发最佳实践
  • 基于HAProxy的高性能缓存服务器nuster
  • 如何学习JavaEE,项目又该如何做?
  • 删除表内多余的重复数据
  • 我与Jetbrains的这些年
  • 一些css基础学习笔记
  • ​Python 3 新特性:类型注解
  • (2020)Java后端开发----(面试题和笔试题)
  • (6)STL算法之转换
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十六)一篇文章学会Java的常用API
  • (正则)提取页面里的img标签
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)Windows2003安全设置/维护
  • (转)大型网站架构演变和知识体系
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET下的多线程编程—1-线程机制概述
  • @media screen 针对不同移动设备
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [100天算法】-目标和(day 79)
  • [android] 手机卫士黑名单功能(ListView优化)
  • [android]-如何在向服务器发送request时附加已保存的cookie数据