- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
public class GameActivity extends Activity {
private static final String TAG = "GameActivity";
. . .
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d(TAG, "+ onTouchEvent(event:" + event + ")");
Log.d(TAG, "- onTouchEvent()");
return super.onTouchEvent(event);
}
. . .
}
public class GameView extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = "GameView";
. . .
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d(TAG, "+ onTouchEvent(event:" + event + ")");
gestureDetector.onTouchEvent(event);
Log.d(TAG, "- onTouchEvent()");
return super.onTouchEvent(event);
}
private SimpleOnGestureListener gestureListener = new SimpleOnGestureListener() {
private static final String TAG = "GestureListener";
@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
Log.d(TAG, "+ onSingleTapConfirmed(event:" + event + ")");
singleTapDetected = true;
Log.d(TAG, "- onSingleTapConfirmed()");
return true;
}
@Override
public boolean onDoubleTap(MotionEvent event) {
Log.d(TAG, "+ onDoubleTap(event:" + event + ")");
doubleTapDetected = true;
Log.d(TAG, "- onDoubleTap()");
return true;
}
};
private GestureDetector gestureDetector = new GestureDetector(getContext(), gestureListener);
. . .
}
我在 AVD 上运行它并在 SurfaceView (GameView) 上单击一下。
根据 LogCat 日志:
03-11 14:19:51.171: D/GameView(4839): + onTouchEvent(event:MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=1071.0, y[0]=437.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=27223172, downTime=27223172, deviceId=0, source=0x1002 })
03-11 14:19:51.171: D/GameView(4839): - onTouchEvent()
03-11 14:19:51.171: D/GameActivity(4839): + onTouchEvent(event:MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=1071.0, y[0]=437.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=27223172, downTime=27223172, deviceId=0, source=0x1002 })
03-11 14:19:51.171: D/GameActivity(4839): - onTouchEvent()
03-11 14:19:51.299: D/GameActivity(4839): + onTouchEvent(event:MotionEvent { action=ACTION_UP, id[0]=0, x[0]=1071.0, y[0]=437.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=27223303, downTime=27223172, deviceId=0, source=0x1002 })
03-11 14:19:51.299: D/GameActivity(4839): - onTouchEvent()
有几个问题:
为什么没有调用 SimpleOnGestureListener
? (尽管 onTouchEvent()
被调用并且大概行 gestureDetector.onTouchEvent(event);
被执行)
为什么 GameActivity 的 onTouchEvent()
获得 ACTION_DOWN 和 ACTION_UP,而 GameView 的 onTouchEvent()
只得到ACTION_DOWN?
我尝试过的一些东西
我在 GameActivity
类上实现了 GestureDetector
,代码如上所示,它按预期工作,调用 onSingleTapConfirmed()
在 GameView 中,创建了一个私有(private)的 class GestureListener extends SimpleOnGestureListener
,而不是私有(private)成员 SimpleOnGestureListener
,并用它来构造 GestureDetector
。我看到了与描述相同的行为,没有调用监听器。
最佳答案
我把代码调试到android源码中,GestureDetector类。这解释了为什么 SimpleOnGestureListener
没有被调用:
onSingleTapConfirmed()
仅当事件不仍然下降时 ( !mStillDown
)所以你看,这两个问题是相关的,当我找到为什么没有发出 ACTION_UP 时,我会解决问题!
编辑
这就完成了答案,现在可以正常工作了。
super.onTouchEvent()
在 GameView 中返回 false
,因为 super
SurfaceView的类是View,返回false
.这就是为什么从不调用 ACTION_UP 的原因super.onTouchEvent()
在 GameActivity 中返回 true
,这就是在 GameActivity 上发出 ACTION_UP 的原因。注意:如果我设置 GameView.setclickable(true)
然后 super.onTouchEvent()
返回 true
. 这也是一个可以接受的解决方案
现在我的 GameView 代码是:
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d(TAG, "+ onTouchEvent(event:" + event + ")");
gestureDetector.onTouchEvent(event);
Log.d(TAG, "- onTouchEvent()");
return true;
}
当前的 LogCat 日志是:
03-11 16:32:06.629: D/GameView(5316): + onTouchEvent(event:MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=977.0, y[0]=414.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=35158623, downTime=35158623, deviceId=0, source=0x1002 })
03-11 16:32:06.629: D/GameView(5316): - onTouchEvent()
03-11 16:32:06.641: D/GameView(5316): + onTouchEvent(event:MotionEvent { action=ACTION_MOVE, id[0]=0, x[0]=978.0, y[0]=414.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=35158623, downTime=35158623, deviceId=0, source=0x1002 })
03-11 16:32:06.641: D/GameView(5316): - onTouchEvent()
03-11 16:32:06.772: D/GameView(5316): + onTouchEvent(event:MotionEvent { action=ACTION_UP, id[0]=0, x[0]=978.0, y[0]=414.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=35158772, downTime=35158623, deviceId=0, source=0x1002 })
03-11 16:32:06.772: D/GameView(5316): - onTouchEvent()
03-11 16:32:06.931: D/GestureListener(5316): + onSingleTapConfirmed(event:MotionEvent { action=ACTION_DOWN, id[0]=0, x[0]=977.0, y[0]=414.0, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=35158623, downTime=35158623, deviceId=0, source=0x1002 })
03-11 16:32:06.931: D/GestureListener(5316): - onSingleTapConfirmed()
关于SurfaceView 中带有 SimpleOnGestureListener 的 Android GestureDetector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15341736/
我想通过在我的 MainActivity 中滑动来切换 Activity 。我从 GestureDetectorCompat 声明了一个对象,并在 onCreate 方法中对其进行了初始化,如下所示:
我的布局xml文件是这样的 我的主要 Activity 是这样的 .... gDetector = new GestureDetector(
我需要在用户从左向右滑动时更改图像;这就是为什么我使用 SimpleOnGestureListener 来检测 ImageView 上的滑动事件。 在此过程中,当我缓慢滑动图像时,onScroll()
我在这个 Android 应用程序上实现了一个 SimpleOnGestureListener,它是基本实现并且一切正常: 该类实现了 OnTouchListener,我将它设置为正确 View 的
我正在实现一个扩展 SimpleOnGestureListener 的 MyGestureDetector。我从以下类(class)借来的:http://www.codeshogun.com/blog
我有一个屏幕,其中有页眉、ScrollView 和页脚中的 TextView。我必须使用 ScrollView,因为 TextView 中的文本也可能很长。 现在,当我为此屏幕使用 SimpleOnG
我已经实现了 SimpleOnGestureListener.onFling(),但我必须非常快地挥动才能触发它。有什么办法让它更灵敏吗? 提前致谢... 最佳答案 触发 onFling() 事件所需
我创建了一个带有 onTouchListener 和手势检测器的自定义组件,我将自定义组件放在 MainActivity 的 xml 文件中,该文件还具有 onTouchEvent 和手势检测器。我想
您好,SimpleOnGestureListener 在我的应用程序中不起作用,这就是我实现它的方式。也许您可以发现问题所在。调试显示应用程序永远不会进入 onFling(...) 方法和 gdt.o
我正在实现一个 onFling 检测器,很像下面的问题: Fling gesture detection on grid layout 但是,我无法让它工作。 如果我设置我的应用程序的某种方式导致了这
我试图在一个简单的 Android 应用程序上检测一个 throw 事件,但第一个 MotionEvent 参数始终为空。为什么使用 null 参数调用 onFling 方法? Android doc
我是 Android 编程的新手,最近我将注意力转向处理简单的手势。我知道 GestureDetector 和监听器,并且我成功地实现了我需要的简单手势(onDown、onFling、onScroll
public class GameActivity extends Activity { private static final String TAG = "GameActivity";
使用这个 mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
我有如下的手势检测器类 class MyGestureListener extends GestureDetector.SimpleOnGestureListener { @Override
我正在使用 SimpleOnGestureListener检测 onSingleTapUp事件和 View 。 View 的比例因子为 5,因此 1 个屏幕像素对应于我 View 中的 5 个像素:
如果 GestureDetector.SimpleOnGestureListener 与 GestureDetector.OnGestureListener 执行相同的操作,但不需要未使用的代码,那么
public class MyActivity extends MapActivity implements LocationListener, OnClickListener { priva
我的应用需要检测简单的手势(滚动、点击、长按)和双指缩放。任何一个检测器都可以独立工作 - GestureDetector.SimpleOnGestureListener 用于点击/滚动和 Scale
我正在尝试创建动画: 用例:1. 用户向右(水平)滑动/拖动项目,项目被添加到购物篮中。如果他再次滑动,则会将一件相同的元素添加到篮子中。2. 用户向左(水平)滑动/拖动项目,项目将从购物篮中删除,如
我是一名优秀的程序员,十分优秀!