博客: 安卓之家
微博: 追风917
CSDN: 蒋朋的家
简书: 追风917

缘由


今天来个小知识点,也许遇到的人不多,但还是记录下。现在安卓机很少有实体键,老罗的情怀也只剩下一丝丝。但是除去手机,其他一些设备,比如电视,盒子等很多还有实体键,那么实体键在按下后就有一些问题,“抖动”和“连击”。

在开发中,我这里有一个很重要的操作,是实体键触发的,在实际测试中,会出现按下一次,多次触发的问题,那么就需要解决下,其实,解决方法也不难,我们开始吧。

“抖动”,“连击”


“抖动”和“连击”是类似的错误操作,可以根据时间来判断,和双击退出 app 的操作是一样的,因此可以重写 onKeyDown 方法:

这里以音量-为例

    private static double DOUBLE_CLICK_TIME = 0L;@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN ) {if ((System.currentTimeMillis() - DOUBLE_CLICK_TIME) > 1500) {//这里测试1500ms比较合适DOUBLE_CLICK_TIME = System.currentTimeMillis();//这里执行单击后的操作}return true;}return super.onKeyDown(keyCode, event);}

这里很好理解,只有两次点击的时间大于 1500ms 才有效,那么抖动和连击都是无效的。

”长按“


默认情况下,我们不做处理的话,一直按住某个按键,是多次单击操作,大家一直按住音量-就会把声音减小到最小。

如果我不做处理,用户一直按着这个键,或者时间稍长,就相当于按了多次,这会导致误操作,因此需要特殊照顾下咯。

直接重写 onKeyLongPress 方法,测试,不调用,那么,肯定是哪里拦截了,google 了下,在万能的 StackOverflow 找到答案:

链接:onKeyDown and onKeyLongPress

这里添加了一个 标记:shortPress,

private boolean shortPress = false;@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {shortPress = false;Toast.makeText(this, "longPress", Toast.LENGTH_LONG).show();return true; } //Just return false because the super call does always the same (returning false) return false;
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {if(event.getAction() == KeyEvent.ACTION_DOWN){event.startTracking();if(event.getRepeatCount() == 0){shortPress = true;} return true; } } return super.onKeyDown(keyCode, event);
} @Override
public boolean onKeyUp(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {if(shortPress){Toast.makeText(this, "shortPress", Toast.LENGTH_LONG).show();} else { //Don't handle longpress here, because the user will have to get his finger back up first } shortPress = false;return true; } return super.onKeyUp(keyCode, event);
} 

综合解决


综合上面的分析,把两种情况综合起来,最终解决方案如下:

private static double DOUBLE_CLICK_TIME = 0L;
private boolean shortPress = false;@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {shortPress = false;Toast.makeText(this, "longPress", Toast.LENGTH_LONG).show();return true; } //Just return false because the super call does always the same (returning false) return false;
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {if(event.getAction() == KeyEvent.ACTION_DOWN){event.startTracking();if(event.getRepeatCount() == 0){shortPress = true;if ((System.currentTimeMillis() - DOUBLE_CLICK_TIME) > 1500) {//这里测试1500ms比较合适DOUBLE_CLICK_TIME = System.currentTimeMillis();//这里执行单击后的操作}return true; } } } return super.onKeyDown(keyCode, event);
} @Override
public boolean onKeyUp(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {if(shortPress){Toast.makeText(this, "shortPress", Toast.LENGTH_LONG).show();} else { //Don't handle longpress here, because the user will have to get his finger back up first } shortPress = false;return true; } return super.onKeyUp(keyCode, event);
} 

好了,到这里就结束了。

最后,非常感谢您的阅读,有任何疑问,可以后面评论,谢谢!

神奇的安卓开发网站:http://androidcat.com/

安卓开源库收集整理:https://github.com/XXApple/AndroidLibs

分享是一种美德,更是一种生活方式!!

也许你会说我是一个梦想者,但我不是唯一的一个。

悦分享,越快乐^_^

欢迎交流,转载请注明出处,谢谢!

安卓开发之屏蔽按键抖动,连击,长按事件相关推荐

  1. 安卓开发之自定义控件TipView仿QQ长按后的提示窗口

    先上效果图: 之前用手机QQ时,一直很觉得这个窗口提示挺不错的,今天将它大概地实现了一遍. 首先是:提示窗口的三角下标是可以改变位置的,然后窗口中有很多小的item,item被点击时会显示出不同的颜色 ...

  2. 安卓开发实战!带你一起探究Android事件分发机制,内容太过真实

    现状 后端转 Android 我该从何处下手,现在学习 android 晚吗? 我的回答是晚还不至于,因为目前是市场趋于稳定正常,这个是市场发展的比如趋势,现在火爆大家都看好的人工智能,大数据,犹如2 ...

  3. 安卓开发学习1:安卓开发资源与方法总结

    开发工具 Android Studio下载 Genymotion 下载 Android Studio配置 Android Studio的Gradle配置国内镜像 Android Studio配置代码提 ...

  4. 虚幻引擎图文笔记:长按事件(Key Hold event)的蓝图实现

    长按事件也是游戏中的常见需求,长按事件的蓝图实现和代码实现思路不太一样,虽然节点用的不多但逻辑有点绕,本文详细解读一下实现方法,并且用宏制作一个拿来即用的长按事件处理节点 长按事件(Key Hold ...

  5. 非Root环境下安卓实现全屏,屏蔽下方虚拟按键:左键、右键。较新安卓系统无法屏蔽Home键。源代码例子

    非Root环境下安卓实现全屏,屏蔽下方虚拟按键:左键.右键.较新安卓系统无法屏蔽Home键. 全屏后,用户上划之后点击虚拟按键如图所示: 代码中分三部分: 1.隐藏屏幕下方的虚拟按键,并且全屏.   ...

  6. 安卓开发30:AsyncTask的用法

    http://blog.csdn.net/initphp/article/details/10392093 安卓开发笔记系列(43)  在开发Android应用时必须遵守单线程模型的原则: Andro ...

  7. android实现电话功能实验报告,安卓开发实验报告-20210407005833.docx-原创力文档

    文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08] 安卓开发实验报告 安卓开发实验报告 目录 页面跳 ...

  8. 安卓开发艺术探索!各种风格的Android面试题进来了解一下,含爱奇艺,小米,腾讯,阿里

    上周喜提oppo面试offer,本人在深圳,有4年多的Android项目经验,普通本科学历. 面试是相互相在,OPPO给我的印象确实如其核心价值观所说:本分. 一面.部长面和HR面都蛮顺利(一千个人可 ...

  9. 私藏系列:你或许从未听过的20个安卓开发工具

    全文共4214字,预计学习时长11分钟 图源:unsplash 本文收录了笔者在日常工作中发现的许多宝藏工具和项目,它们能帮助你开发安卓应用,可供大家参考. 1. AinD: Docker中的Andr ...

最新文章

  1. 2022-2028年中国电子签名行业深度调研及投资前景预测报告
  2. 信不信?以面向对象的思想是可以写好高并发程序的!
  3. HDU - 4348 To the moon(主席树区间更新-标记永久化)
  4. git rebase branch内部调整 调整commit顺序
  5. yum httpd安装详解
  6. windows phone 7.1 RC 版 SDK
  7. 数学之美 与 浪潮之巅
  8. Struts2学习笔记(六) 结果(Result)(上)
  9. 《UTF-8与GB2312之间的互换》的改进
  10. linux nginx rtmp 直播,nginx+rtmp简单直播
  11. NLP实战 | BERT文本分类及其魔改(附代码)
  12. 1168: mxh对lfx的询问(前缀和+素数表)
  13. 优化 | 线性化:0-1变量乘以连续变量的线性化
  14. 上海有计算机专业的专科大学排名,上海高校计算机专业排名情况(前几名)?...
  15. 指标波动的原因很头疼?不妨试试“问诊”法!
  16. 【02】水果蔬菜识别系统-基于tensorflow2.3开发
  17. matlab导入origin,matlab导入origin
  18. ESP32开发板连接TFT屏幕
  19. 豆瓣电影250数据分析精简版
  20. 仿京东、饿了么 左右联动菜单列表自定义View

热门文章

  1. Python试题和规范文档
  2. c#NAudio 录音功能实现
  3. 医生说 | 当心!长期情绪压抑,正在毁掉你的身体
  4. 用投资思维做好招商工作:湘商回归,长沙急企业之所急
  5. Python 蜻蜓fm有声书批量下载 支持账号登录 原创源码
  6. Python热点舆情数据挖掘
  7. 6-1 简单创建对象 (10分) java
  8. 一个小巧的C++Log输出到文件类
  9. Java虚拟机(JVM)面试题(总结最全面的面试题!!!)
  10. Python-Web前端概述