问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android 中怎么监听按键的长按事件

发布网友 发布时间:2022-05-18 17:24

我来回答

1个回答

热心网友 时间:2023-10-21 01:15

  长按事件一般是放到 onKeyLongPress 函数中来处理的。
  那具体是怎么做的呢,下面请看步骤:
  第一步,先在 onKeyDown 函数中判断 event.getRepeatCount 的次数(实际上长按就是由一系列的onKeyDown事件触发的)
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
  case KeyEvent.KEYCODE_VOLUME_DOWN:
  case KeyEvent.KEYCODE_VOLUME_UP:
  if (mCameraAppView.getVisibility() != View.VISIBLE) {
  return false;
  }
  Log.v(TAG,"onKeyDown event.getRepeatCount() "+event.getRepeatCount());
  if (event.getRepeatCount() == 0) {
  event.startTracking();
  return true;
  }
  return true;
  }
  return super.onKeyDown(keyCode, event);
  }
  如果一直按着不放,通过打 log 可以看到
  onKeyDown event.getRepeatCount() 0
  onKeyDown event.getRepeatCount() 1
  onKeyDown event.getRepeatCount() 2
  onKeyDown event.getRepeatCount() 3
  onKeyDown event.getRepeatCount() 4
  onKeyDown event.getRepeatCount() 5
  onKeyDown event.getRepeatCount() 6
  onKeyDown event.getRepeatCount() 7
  onKeyDown event.getRepeatCount() 8
  onKeyDown event.getRepeatCount() 9
  onKeyDown event.getRepeatCount() 10
  onKeyDown event.getRepeatCount() 11
  onKeyDown event.getRepeatCount() 12
  ……
  第二步,重载 onKeyLongPressed 函数,在这个函数中你可以添加你的处理
  @Override
  public boolean onKeyLongPress(int keyCode, KeyEvent event) {
  Log.v(TAG,"key long pressed keyCode = "+keyCode);
  switch (keyCode) {
  case KeyEvent.KEYCODE_VOLUME_UP:
  case KeyEvent.KEYCODE_VOLUME_DOWN:
  Log.v(TAG,"KEYCODE_VOLUME_UP/DOWN long pressed");
  lockLongPressKey = true;
  onShutterButtonLongPressed();
  return true;
  default:
  break;
  }
  return super.onKeyLongPress(keyCode, event);
  }

  第三步,如果在onKeyUp 函数中也处理了相同的按键的话,那么需要对 onKeyLongPress 和 onKeyUp 中该按键的处理作互斥处理了
  @Override
  public boolean onKeyUp(int keyCode, KeyEvent event) {
  switch (keyCode) {
  case KeyEvent.KEYCODE_VOLUME_UP:
  case KeyEvent.KEYCODE_VOLUME_DOWN:
  Log.v(TAG, "onKeyUp event.getRepeatCount() "+event.getRepeatCount());
  if(lockLongPressKey){
  lockLongPressKey = false;
  return true;
  }
  if (event.getRepeatCount() == 0) {
  Log.v(TAG, "prepare for onShutterButtonClick..");
  if (mEnableRecordBtn && mReviewImage.getVisibility() != View.VISIBLE
  && mBgLearningMessageFrame.getVisibility() == View.GONE) {
  if (mShutterButton != null && mShutterButton.isEnabled()) {
  onShutterButtonFocus(false);
  collapseCameraControls();//fulin@20121101@fix PD1218 B121027-224
  onShutterButtonClick();
  }
  }
  }
  if (mCameraAppView.getVisibility() != View.VISIBLE) {
  return false;
  }
  return true;
  }
  return super.onKeyUp(keyCode, event);
  }

  互斥处理的原因是,长按事件处理完后,松开按键后就会执行 onKeyUp 函数。而这两处针对相同的按键想要实现的功能又不一样
  固在此添加一个 private boolean lockLongPressKey = false; 变量,在 onKeyLongPress 函数中处理过以后,在 onKeyUp中便不再处理。
  2, button
  自定义的 button 长按事件则是通过实现 OnLongClickListener 接口来做到的。
  import android.app.Activity;
  import android.os.Bundle;
  import android.view.View;
  import android.view.View.OnLongClickListener;
  import android.widget.Button;
  import android.widget.Toast;
  public class MyActivity extends Activity implements OnLongClickListener{
  Button button;//声明按钮的引用
  public void onCreate(Bundle savedInstanceState) {//重写的onCreate方法
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  button = (Button) this.findViewById(R.id.button);//得到按钮的引用
  button.setTextSize(20);
  button.setOnLongClickListener(this);//注册监听
  }
  public boolean onLongClick(View v) {//实现接口中的方法
  if(v == button){//当按下的是按钮时
  Toast.makeText(
  this,
  "长时间按下了按钮",
  Toast.LENGTH_SHORT
  ).show();//显示提示
  }
  return false;
  }
  }
  
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
笔记本电脑的哪些牌子什么牌子的笔记本电脑好 笔记本电脑品牌质量排行榜你知道哪个最耐用全面解析笔记本电脑品牌的质 ... 十大笔记本电脑品牌笔记本电脑推荐品牌 各大汽车电脑品牌厂家官方售后服务电话合辑v3.00 哪种笔记本电脑售后好哪个品牌电脑售后好 各大笔记本电脑品牌售后网点及售后电话汇总解决您笔记本电脑问题的选 ... 如何教育孩子成学霸 学霸的家长是怎样培养孩子的? 聪明的懒孩子怎么变成学霸 学霸孩子怎么培养 怎么成为芝麻将 ios uilongpressgesturerecognizer怎么传值 在某些电影中警察为什么被叫做“条子” android onLongPress事件是什么 android 长按事件onKeyLongPress 与手势onLongPress区别 麻将怎么算多少翻啊? 麻将中的自摸牌型 一般几番?几钱? 关于麻将问题 成吉思汗麻将问题,高分 麻将条一色.一条对.二条对.三条对.四条四张.六条一张.九条一对.这付牌怎么算 粘麻将条布用什么胶水 杭州麻将条为什么叫梭 孩子吓到怎么办? 麦粒肿已经五六天了,里面还是有东西在磨眼睛 还感觉眼睛酸酸的 我得了麦粒肿,不过只有点肿,今早起来半天都睁不开,而且比昨天肿的还厉害,有点浮肿的感觉 麦粒肿是否是饮食习惯的原因,眼睛刺痛,总感觉有东西在眼睛里,流眼泪怎么办, 麦粒肿波动感是什么感觉? 燃气关闭以后,燃气灶偶尔有砰砰的声 国企改制后,员工干部身份变成了合同制,那么员工档案如何管理?行政介绍信如何开具? 城市管理人员合同制和城市管理人员老务派迁合同制待余一样吗? ThedeviceisinMETAMODE.LongPressPowerbuttontonorma 如何给button添加长按事件 麻将2345566777条胡什么? React Native的开发,有人遇到过这个问题么: Touchable.longPressDelayTimeout 请教个performselector延时执行的问题问题 麻将一条一张二条三张三条三张四条两张五条六条七条八条九条各一张,能胡牌吗? long press power key to continue是什么意思 VB 的命令按钮 如何实现长按功能?! 手机点与长按共存事件。 怎样将下面的代码实现 点击与长按 不冲突? android fragment怎么监听上下滑动 如何找适合自己的工作 NSRunLoop RunLoopMode怎么理解 如何寻找适合自己的职业? 如何去找一个适合自己的工作? 如果你找了个人去工作而几天之后不需要那么多人了,你会怎么办? 一个人要怎样才能找到一份适合自己的工作? 苹果手机 铃声多多下载好的铃声怎么用电脑往手机导阿 但是导不进去找不到文件歌曲在哪里 咋回事阿? 中国古代南方有哪些民族,为何他们不像北方匈奴蒙古一样侵扰中原? 三国时期蜀汉的猛将中死的最可惜的4个人是谁,谁排第一? ajax报error alert能弹出1