我对Android中的两种方法感到困惑.似乎这两种方法都告诉你它是什么类型的事件,即它是一个向下或向上的事件.
我什么时候用哪个?
public void onTouchEvent(MotionEvent e)
Run Code Online (Sandbox Code Playgroud)
请不要引用文档,因为我读了它,并且我没有看到任何参数可以提供给任何一种方法来获得不同的东西.
public final int getAction ()
Run Code Online (Sandbox Code Playgroud)
和
public final int getActionMasked()
Run Code Online (Sandbox Code Playgroud) 我正在调试Android上的一些触摸处理内容,并试图找出发送到我的View的MotionEvent onTouchListener包含取消操作的原因.我无法找到有关其原因的任何文档,并希望有人能指出我正确的方向来调试此问题 - 错误代码,源代码或一些常识.
以下两种方法有什么区别?
int action1 = event.getAction() & MotionEvent.ACTION_MASK;
int action2 = event.getAction();
Run Code Online (Sandbox Code Playgroud) 我想跟踪屏幕上的手指触摸.所以我所做的就是在MotionEvent触发时开始记录位置ACTION_DOWN,但我怎么知道动作何时结束ACTION_CANCEL,或者ACTION_UP?
它们之间的确切区别是什么?
我读了很多关于缩放WebViews主题的门票,并没有找到我的案例的答案.
这是我的设置:
我通常使用这些设置的自定义webview:
getSettings().setBuiltInZoomControls(false);
getSettings().setSupportZoom(false);
getSettings().setUseWideViewPort(true);
getSettings().setLoadWithOverviewMode(true);
Run Code Online (Sandbox Code Playgroud)
让我在这里注意,我依赖于OverviewMode以及WideViewPort来扩展我的WebView.
我还覆盖我的OnTouchEvent,并将所有合适的事件委托给Gesture检测器:
@Override
public boolean onTouchEvent(MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) return true;
return super.onTouchEvent(event);
}
Run Code Online (Sandbox Code Playgroud)
以下是其侦听器实现,它拦截所有doubleTap事件:
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
// Do nothing!
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
// Do nothing!
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// Do nothing!
return true;
}
Run Code Online (Sandbox Code Playgroud)
另外我覆盖了与zoom有关的这两个WebView方法:
@Override
public boolean zoomIn() {
return true;
}
@Override
public boolean zoomOut() {
return true;
}
Run Code Online (Sandbox Code Playgroud)
除了所有这些选项之外,某个抽头频率将导致我的webview放大/缩小.我没有找到一个禁用这种缩放的选项,此Zoom的MotionEvent似乎不适用于GestureDetector,并且覆盖zoomIn()zoomOut()方法也没有效果.
任何人都可以帮助我避免这种双击缩放WebView的行为吗?
我有一个ListView在ScrollView显示意见,我想做到以下几点:
当用户向下滑动时,首先ScrollView应该完全向下滚动,因为列表位于底部.一旦完全关闭,Listiew应该开始滚动.
类似地,当用户向上滚动时,首先ListView(在此处反转的顺序!)应该在ScrollView开始滚动之前向上滚动.
到目前为止,我已经做了以下事情:
listView.setOnTouchListener(new View.OnTouchListener() {
// Setting on Touch Listener for handling the touch inside ScrollView
@Override
public boolean onTouch(View v, MotionEvent event) {
// If going up but the list is already at up, return false indicating we did not consume it.
if(event.getAction() == MotionEvent.ACTION_UP) {
if (listView.getChildCount() == 0 && listView.getChildAt(0).getTop() == 0) {
Log.e("Listview", "At top!");
return false;
}
}
// Similar behaviour …Run Code Online (Sandbox Code Playgroud) 我有一个用户体验要求,用户Dialog通过长按一个单元格来触发GridView.
当Dialog显示时,用户必须能够在屏幕周围移动他们的手指/拇指而不会UP/CANCEL在他们离开GridView细胞边界时触发事件.
当用户最终断开与屏幕的联系时,我正在寻找捕获.GridView似乎记录了一些误报,UP/CANCEL因为我们没有看到使用任何其他观点.
问题是原始视图会捕获所有触摸事件,因为它DOWN是由它捕获的.
对话框在原始视图的UP事件之后注册/看不到任何触摸.
我试过取消原来的触摸事件并使用dispatchTouch()等等.没有快乐.
有任何想法吗?
如何找到导致MotionEvent ACTION_CANCEL的视图?我有一个接收ACTION_CANCEL的视图"A",我不希望这种情况发生.在某处,视图"B"正在"消耗"MotionEvent.我希望有办法找出谁是"B",这样我才能解决这个错误的问题.
我已经尝试查看我的代码中的各种OnTouchEvent()和OnInterceptTouchEvent()处理程序,但还没有找到罪魁祸首.
我还在有问题的ACTION_CANCEL上设置了一个断点,但是我无法识别可能代表"B"的MotionEvent中的任何内容.
我知道这是一个有点重复的问题.我已经回顾了关于SO和其他几个网站的各种问题,但找不到满足我需求的单一答案.
需求
1)我有X,Y坐标,我想创建MotionEvent并将其发送到最顶层的活动/视图.
2)我必须在我自己的应用程序中注入它.因此不应该要求Inject_Events权限.
3)虽然我有坐标,我不知道,活动或视图在那个位置.所以Activity.dispatchTouchEvent对我不起作用..(view.dispatchTouchEvent可以工作,但我不知道视图).
4)仪器也无济于事,因为它们没有单一方法在x,y位置注入触摸事件.
5)InputManager有隐藏方法injectInputEvent但我不知道如何访问injectInputEvent并编译它?
任何帮助赞赏!
想象一下,我有一个从蓝牙设备接收坐标的服务,现在我想在鼠标移动时显示鼠标光标。
我设法使用 toolType = TOOL_TYPE_MOUSE 发送 MotionEvents,但我没有在屏幕上显示本机 android 鼠标光标。
我发送的事件如下所示:
05-14 13:38:05.043: I/onTouchEvent(30301): MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=498.0, y[0]=996.0, toolType[0]=TOOL_TYPE_MOUSE, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=251957430, downTime=251957420, deviceId=1, source=0x2002 }
Run Code Online (Sandbox Code Playgroud)
我正在像这样创建它们:
public void moveMouse(int x, int y) {
// Obtain MotionEvent object
long downTime = SystemClock.uptimeMillis() - 10;
long eventTime = SystemClock.uptimeMillis();
int metaState = 0;
MotionEvent.PointerProperties p = new PointerProperties();
p.toolType = MotionEvent.TOOL_TYPE_MOUSE;
p.id = 0;
MotionEvent.PointerProperties[] properties = {p};
MotionEvent.PointerCoords c = new MotionEvent.PointerCoords();
c.x = x; …Run Code Online (Sandbox Code Playgroud) android ×10
motionevent ×10
touch ×2
debugging ×1
dialog ×1
gridview ×1
input ×1
listview ×1
long-press ×1
motion ×1
mouse ×1
multi-touch ×1
scrollview ×1
touch-event ×1
webview ×1
zoom ×1