按键长按的一种监听方法

监听按键长按有很多方法,这个是和onkeyDown等并列提供的

一种标准方法,只是直接使用不能起作用,需要一些处理才行。

   1.必现在onKeyDown 中将第一次的消息return true;

然后调用event.startTracking();

  2.可以在覆写的onKeyLongPress函数中监听到这个按键长按的事件并

做处理。

  最初从福州出差期间,我始终不明白这个东西是干什么用的,就在昨天我

关机睡觉的时候才想明白了,关机时的电源键需要长按才起作用,你短按一下

没用的。顿时醒悟,或许我们一会可以用到,请各位同仁珍藏。

  谢谢。

  附件是这个Demo的工程,操作起来主要是看log。


/**
 *    这个Demo是用于监听onKeyLongPress函数的,
 * 一般情况下,这个函数是不会被调用的,需要做些特殊
 * 处理,才能监听到按键的长按事件,除KEYCODE_ENTER
 * 和KEYCODE_DPAD_CENTER之外的按键。不同于view的
 * onLongClickListener。
 *    应用情景,比如长按一个按键,然后响应事件。
 *    KeyEvent的Callback回调中,只有这个函数是我们
 * 不熟悉且没有使用到的。另外的onKeyDown和onKeyUp和
 * onKeyMultiple都是我们常用的,这里不赘述。
 *    这里以按键E做测试。
 * @author dingran
 *
 */
public class LongPressTestActivity extends Activity {

    private final String TAG = "dingran.longpress.test.LongPressTestActivity";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    // KEYCODE_ENTER 不行

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        Log.d(TAG, "onKeyDown keyCode = "+keyCode);
//        Log.d(TAG, ""+ 1/0);
        if(keyCode == KeyEvent.KEYCODE_E && event.getRepeatCount() == 0){
            event.startTracking();
            return true;
        }else{
            return false;
        }
        
//        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
        Log.d(TAG, "onKeyLongPress keyCode = "+keyCode);
        if(keyCode == KeyEvent.KEYCODE_E){
            Log.d(TAG, "onKeyLongPress KEYCODE_E");
            return true;
        }
        
        return super.onKeyLongPress(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        Log.d(TAG, "onKeyUp");
        Log.d(TAG, "onKeyUp "+event.getFlags());
        int flag = KeyEvent.FLAG_CANCELED | KeyEvent.FLAG_CANCELED_LONG_PRESS;
        Log.d(TAG, "onKeyUp flag = "+flag);
        if(event.getFlags() == flag){
            Log.d(TAG, "onKeyUp in long press up");
        }
        
        return super.onKeyUp(keyCode, event);
    }

    
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,可以通过监听按键事件来实现按键按和短按功能。可以使用onKeyDown、onKeyUp和onKeyLongPress这三个方法来实现。 在onKeyDown方法中,可以通过判断按键的keyCode来确定是哪个按键被按下。如果是需要实现按和短按功能的按键,可以在按下事件中设置一个全局变量shortPress为true,并在onKeyUp方法中判断该变量的值来执行相应的逻辑。同时,在onKeyDown方法中,可以通过调用event.startTracking()方法来确保onKeyLongPress方法被调用。 在onKeyLongPress方法中,可以通过判断按键的keyCode来确定是哪个按键按。在该方法中可以执行按事件的逻辑,并返回true。 下面是一个示例代码,展示了如何实现按键按和短按功能: ```java private boolean shortPress = false; @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_3) { if (event.getAction() == KeyEvent.ACTION_DOWN) { event.startTracking(); if (event.getRepeatCount() == 0) { shortPress = true; } return true; } } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyLongPress(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_3) { // 按事件的逻辑 return true; } return false; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_3) { if (shortPress) { // 短按事件的逻辑 } shortPress = false; return true; } return super.onKeyUp(keyCode, event); } ``` 请注意,以上代码仅为示例,具体的实现方式可能会根据实际需求而有所不同。 #### 引用[.reference_title] - *1* [android 区分按键按及短按](https://blog.csdn.net/sinduanan/article/details/82771101)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android按键按与短按事件](https://blog.csdn.net/yao201606/article/details/70085093)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值