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;
}
- 还有一种判断方式 就是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详细配置教程