安卓(Android) 监听按键长按事件

1,key -- 实体按键

现在手机物理按键越来越少

常见的有 KEYCODE_VOLUME_DOWN/UP KEYCODE_POWER KEYCODE_BACK KEYCODE_HOME KEYCODE_MENU

在一个activity 重载父类 的下面这三个方法来处理按键事件

public boolean onKeyDown(int keyCode, KeyEvent event):   public boolean onKeyUp(int keyCode, KeyEvent event):   public boolean onKeyLongPress(int keyCode, KeyEvent event):

很明显,长按事件一般是放到 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 中该按键的处理作互斥处理了

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

以上,就是小编对Android 监听按键的长按事件详解,欢迎补充,谢谢支持!

时间: 2024-07-29 15:58:28

安卓(Android) 监听按键长按事件的相关文章

安卓(Android) 监听按键长按事件_Android

1,key -- 实体按键 现在手机物理按键越来越少  常见的有 KEYCODE_VOLUME_DOWN/UP KEYCODE_POWER KEYCODE_BACK KEYCODE_HOME KEYCODE_MENU  在一个activity 重载父类 的下面这三个方法来处理按键事件 public boolean onKeyDown(int keyCode, KeyEvent event): public boolean onKeyUp(int keyCode, KeyEvent event):

Android监听获取应用的安装和卸载事件

Android 应用程序的安装和卸载事件,是由系统进行监听并全局广播的,支 持1.5(android 3)以上 因此,如果想要监听获取应用的安装和卸载事 件,只需要自定义一个BroadcastReceiver,来对系统广播进行监听和处理 BroadcastReceiver 是系统全局广播监听类, 其主要方法是onReceive (),自定义的广播类继承于它并实现自己的onReceive()处理逻辑 BroadcastReceiver 使用前,需要进行注册监听(xml和代码两种方式) ,不使用时需

应用-【安卓初学者】安卓back监听事件怎么让他直接返回到系统主界面

问题描述 [安卓初学者]安卓back监听事件怎么让他直接返回到系统主界面 安卓back监听事件怎么让他直接返回到系统主界面..和home键一样.应用程序继续在后台跑 ...我们老师让我们做一个音乐播放器..按下home键就可以在后台运行...再次打开应用程序的时候进度条和分钟数也显示正常.一直在后台运行并且也更新到界面的.但是按下back键之后界面关闭之后进度条就会有问题..而且单击下一曲的时候会两首歌同时播放. 解决方案 Intent mIntent = new Intent(Intent.A

Android开发-之监听button点击事件的多种方法_Android

 在Android下,事件的发生是在监听器下进行,android系统可以响应按键事件和触摸屏事件,本文主要介绍了button点击事件的方法 一.实现button点击事件的方法 实现button点击事件的监听方法有很多种,这里总结了常用的四种方法: 1.匿名内部类 2.外部类(独立类) 3.实现OnClickListener接口 4.添加XML属性 每一种方法都有它的优点也有它的不足,那么接下来就来详细的讲解这四个实现方法  二.具体实现 1.匿名内部类: 在Android开发中我们会经常看到各种

Android项目类似淘宝 电商 搜索功能,监听软键盘搜索事件,延迟自动搜索,以及时间排序的搜索历史记录的实现_Android

最近跳槽去新公司,接受的第一个任务是在 一个电商模块的搜索功能以及搜索历史记录的实现. 需求和淘宝等电商的功能大体差不多,最上面一个搜索框,下面显示搜索历史记录.在EditText里输入要搜索的关键字后,按软键盘的搜索按键/延迟xxxxms后自动搜索.然后将搜索的内容展示给用户/提示用户没有搜到相关信息. 历史记录是按时间排序的,最新的在前面,输入以前搜索过的关键字,例如牛仔裤(本来是第二条),会更新这条记录的时间,下次再看,牛仔裤的排列就在第一位了.并且有清除历史记录的功能. 整理需求,大致需

封装的android监听手指左右滑动屏幕的事件类分享_Android

左右滑动是智能手机最常用的动作,在此简单的封装了一下,以后直接拿来用就可以了. 简单的只需要几行就可以了,下面那个类是封装好了的. package com.example.test; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.util.Log; import android.widget.RelativeLayout; public c

android监听返回按钮事件的方法_Android

本文实例讲述了android监听返回按钮事件的方法.分享给大家供大家参考.具体如下: 用户在点击手机的返回按钮时,默认是推出当前的activty,但是有时用户不小心按到返回,所以需要给用户一个提示,这就需要重写onkeydown事件,实现的效果如下: java代码如下: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.l

android监听返回按钮事件的方法

本文实例讲述了android监听返回按钮事件的方法.分享给大家供大家参考.具体如下: 用户在点击手机的返回按钮时,默认是推出当前的activty,但是有时用户不小心按到返回,所以需要给用户一个提示,这就需要重写onkeydown事件,实现的效果如下: java代码如下: @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.l

封装的android监听手指左右滑动屏幕的事件类分享

左右滑动是智能手机最常用的动作,在此简单的封装了一下,以后直接拿来用就可以了. 简单的只需要几行就可以了,下面那个类是封装好了的. package com.example.test; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.util.Log; import android.widget.RelativeLayout; public c