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