欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-24 17:36:58
...

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

现在关于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里面进行注册这个接口 ,才能使用。
至此 完结。有什么疑问的小伙伴可以私信~

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

上一篇: Maven详细配置教程

下一篇: