当前位置: 首页 > 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)}

这个就不用解释了吧。

http://www.lryc.cn/news/268924.html

相关文章:

  • spring boot 配置全局日期和时间格式
  • GoLang学习之路,对Elasticsearch的使用,一文足以(包括泛型使用思想)(二)
  • 鸿蒙APP的代码规范
  • 蓝桥杯-每日刷题-027
  • 安装Node修改Node镜像地址搭建Vue脚手架创建Vue项目
  • git 学习 之一个规范的 commit 如何写
  • 2023 年人工智能研究与技术排名前 10 的国家
  • 留言板(Mybatis连接数据库版)
  • 第十二章 Sleuth分布式请求链路跟踪
  • EasyExcel多线程批量导出数据,动态表头,静态资源访问
  • 树莓派界面改成中文
  • 软件工程期末复习
  • 【linux】select实现定时器
  • Android 13 - Media框架(28)- MediaCodec(三)
  • Azure 学习总结
  • 数据库是否可以直接作为数据仓库的数据源
  • IntelliJ IDE 插件开发 | (四)开发一个时间管理大师插件
  • 【ChatGPT 默认强化学习策略】PPO 近端策略优化算法
  • 【银行测试】金融银行-理财项目面试/分析总结(二)
  • 张江智荟毁约offer
  • ubuntu 系统终端颜色设置
  • 【Vue】class与style绑定
  • 大厂前端面试题总结(百度、字节跳动、腾讯、小米.....),附上热乎面试经验!
  • EXPLORING DIFFUSION MODELS FOR UNSUPERVISED VIDEO ANOMALY DETECTION 论文阅读
  • 当 ML 遇到 DevOps:如何理解 MLOps
  • vue+element+springboot实现多张图片上传
  • react使用useState更新数组失败
  • 《LIO-SAM阅读笔记》3.后端优化
  • mac下jd-gui提示没有找到合适的jdk版本
  • FlinkSQL窗口实例分析