Java Android-onTouchEvent仅第一次工作

Java Android-onTouchEvent仅第一次工作,java,android,touch-event,Java,Android,Touch Event,我有一张画布画,它正在使用OnTouch,但是由于某些原因,我无法让它正常工作。它第一次工作(第一次触摸动作)。但是,当用户移除手指时,OnTouch将不再运行,从而阻止用户移动角色项 在做了大量的研究和各种不同的选择之后,我根本无法实现这一点,在这样做的过程中,我注意到第一次调用ACTION_DOWN,然后调用on ACTION_UP 下面你可以找到我的两段代码,第一段是实际的onTouchEvent。第二个是用于在我绘制的画布(基于迷宫(5x5))中处理用户权限的代码 另一个考虑的是画布重画

我有一张画布画,它正在使用OnTouch,但是由于某些原因,我无法让它正常工作。它第一次工作(第一次触摸动作)。但是,当用户移除手指时,OnTouch将不再运行,从而阻止用户移动角色项

在做了大量的研究和各种不同的选择之后,我根本无法实现这一点,在这样做的过程中,我注意到第一次调用ACTION_DOWN,然后调用on ACTION_UP

下面你可以找到我的两段代码,第一段是实际的onTouchEvent。第二个是用于在我绘制的画布(基于迷宫(5x5))中处理用户权限的代码

另一个考虑的是画布重画(失效),每次用户位置移动(这是按平方做的)

迷宫位置处理程序代码:

public boolean move(int direction) 
{
    boolean moved = false;
    if(direction == UP) 
    {
        if(currentY != 0 && !horizontalLines[currentY-1][currentX]) 
        {
            currentY--;
            moved = true;
        }
    }
    if(direction == DOWN) 
    {
        if(currentY != verticalLines[0].length-1 && !horizontalLines[currentY][currentX]) 
        {
            currentY++;
            moved = true;
        }
    }
    if(direction == RIGHT) 
    {
        if(currentX != horizontalLines[0].length-1 && !verticalLines[currentY][currentX]) 
        {
            currentX++;
            moved = true;
        }
    }
    if(direction == LEFT) 
    {
        if(currentX != 0 && !verticalLines[currentY][currentX-1]) 
        {
            currentX--;
            moved = true;
        }
    }
    if(moved) 
    {
        if(currentX == finalX && currentY == finalY) 
        {
            gameComplete = true;
        }
    }
    return moved;
}

似乎是掩码和您在开关上应用的事件有问题。看看这个

这里有一个很好的触摸示例,它是否有用不确定

 public boolean onTouch(View v, MotionEvent event) {
   layoutParams = (RelativeLayout.LayoutParams) ima1.getLayoutParams();

     switch(event.getAction())                   
        {
          case MotionEvent.ACTION_DOWN:                          
                break;     

          case MotionEvent.ACTION_MOVE:
                int x_cord = (int) event.getRawX();
                int y_cord = (int) event.getRawY();

          System.out.println("value of x" +x_cord);
          System.out.println("value of y" +y_cord);           

                if (x_cord > windowwidth) {
                    x_cord = windowwidth;
                   }
                if (y_cord > windowheight) {
                    y_cord = windowheight;
                   }
         layoutParams.leftMargin = x_cord-25;
         layoutParams.topMargin = y_cord-25;
         //   layoutParams.rightMargin = x_cord-25;
         //   layoutParams.bottomMargin = y_cord-25;
         ima1.setLayoutParams(layoutParams);
                 break;
           default: break;
          }  
           return true;
        }
     });

     ima2 = (ImageView)findViewById(R.id.imageview2);
     ima2.setOnTouchListener(new View.OnTouchListener() {         

 public boolean onTouch(View v, MotionEvent event) {
     layoutParams = (RelativeLayout.LayoutParams) ima2.getLayoutParams();
          switch(event.getActionMasked())
             {
               case MotionEvent.ACTION_DOWN:
                   break;
               case MotionEvent.ACTION_MOVE:
                   int x_cord = (int) event.getRawX();
                   int y_cord = (int) event.getRawY();

                   System.out.println("value of x1" +x_cord);
               System.out.println("value of y1" +y_cord);                            

                    if (x_cord > windowwidth) {
                        x_cord = windowwidth;
                    }
                    if (y_cord > windowheight) {
                        y_cord = windowheight;
                    }
                    layoutParams.leftMargin = x_cord - 25;
                    layoutParams.topMargin = y_cord - 75;
                    ima2.setLayoutParams(layoutParams);
                    break;
                default: break;
            }
            return true;
        }
    });
   }     
 }

这是一个示例

我非常确定每次都会调用您的
触摸
,我怀疑您的案例不符合要求的原因

要进行交叉检查,只需打印日志

@Override
public boolean onTouchEvent(MotionEvent event) 
{
   System.out.println("Touch working");
   return false;
}

尝试将最终返回更改为True而不是False 就像这样:

@Override
public boolean onTouchEvent(MotionEvent event) 
{
float touchX = event.getX();
float touchY = event.getY();
int currentX = maze.getCurrentX();
int currentY = maze.getCurrentY();
switch (event.getAction() & MotionEvent.ACTION_MASK) 
{
    case MotionEvent.ACTION_DOWN:
    {
        if(Math.floor(touchX/totalCellWidth) == currentX &&Math.floor(touchY/totalCellHeight) == currentY) 
        {
            dragging = true;
            return true;
        }
    }
    case MotionEvent.ACTION_UP:
        dragging = false;
        return true;
    case MotionEvent.ACTION_MOVE:
        if(dragging) 
        {
            int cellX = (int)Math.floor(touchX/totalCellWidth);
            int cellY = (int)Math.floor(touchY/totalCellHeight);

            if((cellX != currentX && cellY == currentY) || (cellY != currentY && cellX == currentX)) 
            {
                //either X or Y changed
                boolean moved = false;
                //check horizontal ball movement
                switch(cellX-currentX) 
                {
                case 1:
                    moved = maze.move(Maze.RIGHT);
                    break;
                case -1:
                    moved = maze.move(Maze.LEFT);
                }
                //check vertical ball movement
                switch(cellY-currentY) 
                {
                case 1:
                    moved = maze.move(Maze.DOWN);
                    break;
                case -1:
                    moved = maze.move(Maze.UP);
                }

                if(moved) 
                {
                    invalidate();
                    if(maze.isGameComplete()) 
                    {
                        showFinishDialog();
                    }
                }
            }
            return true;
        }
  }
    return True;  // Here 
 }

主要的问题是,在每个案例的结尾,您都缺少一个中断语句。 您在其他情况下失败,并在第二个操作失败时返回false。这意味着不会调用“向上移动”操作

要解决此问题,请执行以下操作: -在每个案例的结尾添加break语句
-始终从操作向下返回true

不要返回true,而是返回false

if(Math.floor(touchX/totalCellWidth) == currentX && Math.floor(touchY/totalCellHeight) == currentY) 
{
    dragging = true;
    return false;
}

putreturn=true而不是开关案例的最后一个语句中的false。因为如果您使用false,它将只调用一次,并且其他视图无法获取该特定视图的触摸事件。。因此,请使用true而不是false

理论
在onTouchEvent()中返回true告诉Android系统您已经处理了触摸事件,不需要进一步处理。如果返回false,Android系统将是onTouch事件的处理程序,并将覆盖您的代码,以处理任何超过ACTION_DOWN的事件(这是触摸屏幕时的第一个事件)


我也有同样的问题,现在解决了。我想这可能会对你有所帮助。

我认为这一部分令人不快

 event.getAction() & MotionEvent.ACTION_MASK
但再看一次,它似乎是好的。。。尝试将此替换为

 event.getMaskedAction()
把它放在开关上

或者你可能需要使用动作指针,而不是动作指针

你能改一下这段代码吗

case MotionEvent.ACTION_MOVE:
    Log.d(LOGTAG, "ACTION_MOVE block, dragging = "+dragging);
    if(dragging) 
    {
        Log.d(LOGTAG, "Dragging fired with event: "+event.toString());
        int cellX = (int)Math.floor(touchX/totalCellWidth);
        int cellY = (int)Math.floor(touchY/totalCellHeight);
        // ...
请把输出贴出来


编辑:另外,请记住,仅当您希望完全使用事件时,才希望从onlistener返回true;如果要进一步传播,请返回false。因此,我想这些返回中只有一个需要为真,并让其他返回通过它们各自的视图的ontouch处理程序进行处理…

从开关中删除MotionEvent.ACTION\u掩码case@AkashG,尝试过,但没有成功其他想法?你的意思是,当用户第一次执行“向下+移动+向上”操作时,它可以,但下次不起作用?第二次进入移动和拖动是否等于真?@Dayerman,这正是我的意思,它似乎不会被第二次触发第二次进入移动和拖动是否等于真?(尝试调试或记录)是的,似乎每次我移动或触摸屏幕时都会调用它,例如,如果我将用户向下移动3个空格,它会被调用3次,我如何修复上述代码,使其正常工作?谢谢,请查看我的修改后的onTouch代码(此代码仍然无法正常工作)。请查看我的修改后的onTouch代码(此代码仍然无法正常工作)。请查看我的修改后的onTouch代码(此代码仍然无法正常工作)。请尝试始终从操作\u向下返回true。如果您返回false,您将永远不会收到移动或向上移动的调用。您需要调试以下内容:在代码中添加日志消息,并查看您到达的位置和未到达的位置。尽管我已将结束返回更改为false,但请查看我的修改后的onTouch代码(但仍然无法正常工作)。请查看我的修改后的onTouch代码(仍然无法正常工作).我现在在switch语句的末尾返回true,但是仍然遇到相同的问题。请在我的问题中查看我修改的onTouch代码。Thanks在这里变为false会完全破坏代码,第一次触摸就不起作用了。还有其他想法吗?谢谢,我已经用与上面mentioend相同的方式修改了我的代码,但是它仍然不起作用。我在这里添加了新的onTouch代码和错误日志。我还在日志中添加了我当前的X&Y。最后,需要注意的是,我的onTouch涉及到绘制一个迷宫,基本上迷宫是100x100,但只显示5x5,因此当用户移动时,当前的X&Y会因其在迷宫中的位置而改变(这可能会影响onTouch)。如果我们能在接下来的4小时内把它整理好,我就可以理所当然地给你奖金。谢谢
case MotionEvent.ACTION_MOVE:
    Log.d(LOGTAG, "ACTION_MOVE block, dragging = "+dragging);
    if(dragging) 
    {
        Log.d(LOGTAG, "Dragging fired with event: "+event.toString());
        int cellX = (int)Math.floor(touchX/totalCellWidth);
        int cellY = (int)Math.floor(touchY/totalCellHeight);
        // ...