Java Android 2.2 SurfaceView#onTouchEvent()将为每个事件调用两次
因此,我跟随2D图形教程(感兴趣的人,这是一个@),我在onTouchEvent()回调中遇到了不断的崩溃。我仍在尝试跟踪bug,但在尝试调试问题时,我注意到我的onTouchEvent回调会为每个事件调用两次 供再次参考Java Android 2.2 SurfaceView#onTouchEvent()将为每个事件调用两次,java,android,surfaceview,Java,Android,Surfaceview,因此,我跟随2D图形教程(感兴趣的人,这是一个@),我在onTouchEvent()回调中遇到了不断的崩溃。我仍在尝试跟踪bug,但在尝试调试问题时,我注意到我的onTouchEvent回调会为每个事件调用两次 供再次参考 @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); synchronized (getHolde
@Override
public boolean onTouchEvent(MotionEvent event)
{
int action = event.getAction();
synchronized (getHolder()) {
if (action == MotionEvent.ACTION_DOWN) {
if (gameObjects.size() < 2) {
currentlySelected = new GameObject(BitmapFactory.decodeResource(getResources(), R.drawable.icon));
currentlySelected.getCoordinates().setX((int) event.getX());
currentlySelected.getCoordinates().setY((int) event.getY());
} else {
for (GameObject gameObject: gameObjects) {
if (gameObject.inBoundingBox(event.getX(), event.getY())) {
currentlySelected = gameObject;
break;
}
}
if (currentlySelected != null) {
// Remember to remove it from the list so that we don't waste time updating it in updatePhysics twice.
gameObjects.remove(currentlySelected);
}
}
} else if (action == MotionEvent.ACTION_UP && (currentlySelected != null)) {
gameObjects.add(currentlySelected);
currentlySelected = null;
} else if (action == MotionEvent.ACTION_MOVE) {
currentlySelected.getCoordinates().setX((int) event.getX());
currentlySelected.getCoordinates().setY((int) event.getY());
}
}
@覆盖
公共布尔onTouchEvent(运动事件)
{
int action=event.getAction();
已同步(getHolder()){
if(action==MotionEvent.action\u DOWN){
if(gameObjects.size()<2){
currentlySelected=新游戏对象(BitmapFactory.decodeResource(getResources(),R.drawable.icon));
currentlySelected.getCoordinates().setX((int)event.getX());
currentlySelected.getCoordinates().setY((int)event.getY());
}否则{
用于(游戏对象游戏对象:游戏对象){
if(gameObject.inBoundingBox(event.getX(),event.getY()){
currentlySelected=游戏对象;
打破
}
}
如果(currentlySelected!=null){
//记住从列表中删除它,这样我们就不会浪费时间在updatePhysics中更新它两次。
gameObjects.remove(当前选择);
}
}
}else if(action==MotionEvent.action\u UP&&(currentlySelected!=null)){
gameObjects.add(当前选择);
currentlySelected=null;
}else if(action==MotionEvent.action\u MOVE){
currentlySelected.getCoordinates().setX((int)event.getX());
currentlySelected.getCoordinates().setY((int)event.getY());
}
}
否当我在第一行上放置断点,并在调试模式下运行它时,当我触摸屏幕时,将使用以下操作调用回调
对于每个动作,第二个动作都会在同步调用时发出。有人知道这种行为的原因吗?首先,我自己就是一个完全的android新手 根据开发人员文档,onTouchEvent方法要求您使用自己的方法实现覆盖该方法。这似乎不太实际,因为您需要在希望使用touchevent执行操作的位置扩展每个视图对象 如果我从中理解正确,则必须实现各种事件侦听器之一(根据您的需要)而不是实现onTouchEvent方法。我的猜测是,如果您重写onTouchEvent,该方法必须自己搜索哪个事件处理程序适合该作业。因此,它必须再次将相同的信息传递给此事件侦听器,因此,我们有“两次”相同的事件调用 这只是我的猜测,希望有人能证明这一点
我也遇到了同样的情况,我会尝试一下上面提到的文档页面中的指南。如果这些内容发生了变化,我会让你知道的!事实证明,问题出在线路上
synchronized (getHolder()) {
应该是的
SurfaceHolder h = getHolder()
syncronized(h) {
这似乎解决了我的问题。p.S.:我试了一下,就像上面描述的那样,但遇到了更多的麻烦……我想这对我来说是一条死胡同。。。