android 鼠标左击右击监听事件GestureDetector.OnContextClickListener

好久没写过博客了 今天来一篇技术播客~

现在关于GestureDetector的文章是越来越多,但是大部分的版本都差不多,今天它里面回调的方法暂且不介绍了,现在只介绍一下关于GestureDetector它外接鼠标时的用法!!

1 . 如果我们外接鼠标想要获取到鼠标的右击事件,可以这么判断,

 // 按键是鼠标右键,在释放按键时回调
if (event.getActionButton() == MotionEvent.BUTTON_SECONDARY && event.getActionMasked() == MotionEvent.ACTION_BUTTON_RELEASE) {
     //event.getActionMasked() == MotionEvent.ACTION_BUTTON_RELEASE
     //这是鼠标抬起的时候回调,还有一个按下的时候回调
      //event.getActionMasked() == MotionEvent.ACTION_BUTTON_PRESS
}

想要鼠标左击事件可以这么写

      // 鼠标左键按下即可触发拖动
                    if (event.getActionButton() == MotionEvent.BUTTON_PRIMARY &&event.getActionMasked() == MotionEvent.ACTION_BUTTON_PRESS) {
  
                    }

另外再贴几个方法 希望对大家有所帮助

  switch (event.getActionButton()) {
                        case MotionEvent.BUTTON_PRIMARY:
                            Log.d("鼠标左键单击事件");
                            break;
                        case MotionEvent.BUTTON_SECONDARY:
                            Log.d("鼠标右键单击事件");
                            break;
                        case MotionEvent.BUTTON_TERTIARY:
                            Log.d("鼠标中键单击事件");
                            break;
                        case MotionEvent.BUTTON_FORWARD:
                            Log.d("鼠标前进键按下");

这个是OnContextClickListener 源码中的写法

 public boolean onGenericMotionEvent(MotionEvent ev) {
        if (mInputEventConsistencyVerifier != null) {
            mInputEventConsistencyVerifier.onGenericMotionEvent(ev, 0);
        }

        final int actionButton = ev.getActionButton();
        switch (ev.getActionMasked()) {
        //鼠标按下的时候回调
            case MotionEvent.ACTION_BUTTON_PRESS:
                if (mContextClickListener != null && !mInContextClick && !mInLongPress
                        && (actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY
                        || actionButton == MotionEvent.BUTTON_SECONDARY)) {
                    if (mContextClickListener.onContextClick(ev)) {
                        mInContextClick = true;
                        mHandler.removeMessages(LONG_PRESS);
                        mHandler.removeMessages(TAP);
                        return true;
                    }
                }
                break;
      //鼠标抬起的时候回调
            case MotionEvent.ACTION_BUTTON_RELEASE:
                if (mInContextClick && (actionButton == MotionEvent.BUTTON_STYLUS_PRIMARY
                        || actionButton == MotionEvent.BUTTON_SECONDARY)) {
                    mInContextClick = false;
                    mIgnoreNextUpEvent = true;
                }
                break;
        }
        return false;
    }
  1. 还有一种判断方式 就是OnContextClickListener ,注意这个OnContextClickListener 跟上面那个用的方式差不多,只是换了一种实现方式,并不是现在写的这个方法跟上面那个是关联的,这一点要区分
    GestureDetector下面有一个监听的方法就是实现 GestureDetector.OnContextClickListener会回调一个方法
  @Override
        public boolean onContextClick(MotionEvent e) {
   			//这里就是回调的方法
            return true;
        }
    }

在这个方法中源码给的解释是

  /**
     * The listener that is used to notify when a context click occurs. When listening for a
     * context click ensure that you call {@link #onGenericMotionEvent(MotionEvent)} in
     * {@link View#onGenericMotionEvent(MotionEvent)}.
     */
    public interface OnContextClickListener {
        /**
         * Notified when a context click occurs.
         *
         * @param e The motion event that occurred during the context click.
         * @return true if the event is consumed, else false
         */
        boolean onContextClick(MotionEvent e);
    }

大致的意思是 发生了单击的时候调用这个方法,这个事件已经被点击了, 就会true 没有则false

那么我们判断鼠标右击或者左击肯定可以在这个方法里面实现。

在这个方法里面千万不要用方法一中的方式来判断鼠标右击,你会进入一个误区的!

记住这个onContextClick 无论是左击还是右击,都会回调这个方法,假如我们的需求是只要鼠标右击,这时候该怎么判断 。

下面是我在鼠标右击和左击时,打印 onContextClick 这个方法的MotionEvent e得到的结果,大家仔细观察下有什么不同

左键按下
2020-08-19 15:00:09.441 22063-22063/zlq: MotionEvent e  as MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=83.53086, y[0]=127.55353, toolType[0]=TOOL_TYPE_MOUSE, buttonState=BUTTON_PRIMARY, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=71898765, downTime=71898765, deviceId=15, source=0x2002, displayId=0 } -- > MotionEvent e.getAction() as 0
左键抬起
2020-08-19 15:00:09.525 22063-22063/zlq: MotionEvent e  as MotionEvent { action=ACTION_UP, actionButton=0, id[0]=0, x[0]=83.53086, y[0]=127.55353, toolType[0]=TOOL_TYPE_MOUSE, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=71898832, downTime=71898765, deviceId=15, source=0x2002, displayId=0 } -- > MotionEvent e.getAction() as 1

右键按下
2020-08-19 15:00:57.979 22063-22063/zlq: MotionEvent e  as MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=487.6794, y[0]=144.78735, toolType[0]=TOOL_TYPE_MOUSE, buttonState=BUTTON_SECONDARY, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=71947309, downTime=71947309, deviceId=15, source=0x2002, displayId=0 } -- > MotionEvent e.getAction() as 0
右键抬起
2020-08-19 15:00:58.130 22063-22063/zlq: MotionEvent e  as MotionEvent { action=ACTION_UP, actionButton=0, id[0]=0, x[0]=487.6794, y[0]=144.78735, toolType[0]=TOOL_TYPE_MOUSE, buttonState=0, classification=NONE, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=71947455, downTime=71947309, deviceId=15, source=0x2002, displayId=0 } -- > MotionEvent e.getAction() as 1

看这个结果轻而易举的可以看出来,我们想拿到鼠标右击(左击) 按下 的时候的事件很简单
最后得出的结果是

 if (e.getButtonState() ==BUTTON_SECONDARY){
      //这是鼠标的右击事件
    }
if(e.getButtonState() == BUTTON_PRIMARY){
	//这是鼠标的左击事件
}

还有一点,这个方法想要使用必须要重写 当前对象的onTouch 方法,用这个方法xxxxx.onContextClick(event);在onTouch里面进行注册这个接口 ,才能使用。
至此 完结。有什么疑问的小伙伴可以私信~

如果有不足之处还请多多指教~

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值