Java ACTION\u MOVE每次在OnTouch中调用时都返回相同的值

Java ACTION\u MOVE每次在OnTouch中调用时都返回相同的值,java,android,ontouch,Java,Android,Ontouch,我试图调用一个方法,每次调用ACTION\u MOVE时都用不同的值更新tts元素。但是,它每次调用时都返回相同的值。respondCoordinates(v)方法有一个if语句来更改值 public boolean onTouch(View v, MotionEvent event) { //_gestureDetector.onTouchEvent(event); int eventAction = event.getAction(); // you may ne

我试图调用一个方法,每次调用
ACTION\u MOVE
时都用不同的值更新tts元素。但是,它每次调用时都返回相同的值。
respondCoordinates(v)
方法有一个
if
语句来更改值

public boolean onTouch(View v, MotionEvent event) {
    //_gestureDetector.onTouchEvent(event);

    int eventAction = event.getAction();

    // you may need the x/y location
    int x = (int)event.getRawX();
    int y = (int)event.getRawY();

    Point boardPos = getBoardIndexX(new Point(x,y));
    // put your code in here to handle the event
    switch (eventAction) {
        case MotionEvent.ACTION_DOWN:

            Log.d("Chess", "Down: " + x + ", " + y + " [" + boardPos.x + ", " + boardPos.y + "]");
            if(OnBoard(boardPos))
            {
                // then play
                lastPlayTime = System.currentTimeMillis();
                lastPlayPos.x = boardPos.x;
                lastPlayPos.y = boardPos.y;
                respondCoordinates(v);

            }

            break;//return true;
        case MotionEvent.ACTION_UP:
            Log.d("Chess", "Up: " + x + ", " + y + " [" + boardPos.x + ", " + boardPos.y + "]");
            lastPlayPos.x = -1;
            lastPlayPos.y = -1;

            v.performClick();
            break;//return true;
        case MotionEvent.ACTION_MOVE:
            if(boardPos.x != lastPlayPos.x || boardPos.y != lastPlayPos.y) {
                // then we're on a new square
                Log.d("Chess", "Move: " + x + ", " + y + " [" + boardPos.x + ", " + boardPos.y + "]");
                lastPlayPos.x = boardPos.x;
                lastPlayPos.y = boardPos.y;

                if(OnBoard(boardPos))
                {
                    // then play
                    lastPlayTime = System.currentTimeMillis();
                    respondCoordinates(v);
                }
            }
    }
    // tell the View to redraw the Canvas
    //invalidate();

    return true;//super.onTouchEvent(event);
}

public void respondCoordinates(View v) {

    int iTo = getIndexOfButton(v);

    String join = "";
    String letter = "";
    String number = "";
    String piece = "";


    if ((iTo >= 0) && (iTo <= 7)) {
        if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.PAWN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.PAWN) {
            piece = "Pawn";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.BISHOP || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.BISHOP) {
            piece = "Bishop";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.ROOK || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.ROOK) {
            piece = "Rook";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KNIGHT || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KNIGHT) {
            piece = "Knight";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.QUEEN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.QUEEN) {
            piece = "Queen";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KING || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KING) {
            piece = "King";
        }
        number = "8";
        if (iTo == 0) {
            letter = "a";


        } else if (iTo == 1) {
            letter = "b";
        } else if (iTo == 2) {
            letter = "c";
        } else if (iTo == 3) {
            letter = "d";

        } else if (iTo == 4) {
            letter = "e";

        } else if (iTo == 5) {
            letter = "f";

        } else if (iTo == 6) {
            letter = "g";

        } else if (iTo == 7) {
            letter = "h";

        }

    } else if ((iTo >= 8) && (iTo <= 15)) {
        number = "7";
        if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.PAWN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.PAWN) {
            piece = "Pawn";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.BISHOP || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.BISHOP) {
            piece = "Bishop";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.ROOK || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.ROOK) {
            piece = "Rook";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KNIGHT || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KNIGHT) {
            piece = "Knight";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.QUEEN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.QUEEN) {
            piece = "Queen";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KING || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KING) {
            piece = "King";
        }

        if (iTo == 8) {
            letter = "a";
        } else if (iTo == 9) {
            letter = "b";
        } else if (iTo == 10) {
            letter = "c";
        } else if (iTo == 11) {
            letter = "d";
        } else if (iTo == 12) {
            letter = "e";
        } else if (iTo == 13) {
            letter = "f";
        } else if (iTo == 14) {
            letter = "g";
        } else if (iTo == 15) {
            letter = "h";
        }


    } else if ((iTo >= 16) && (iTo <= 23)) {
        number = "6";
        if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.PAWN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.PAWN) {
            piece = "Pawn";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.BISHOP || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.BISHOP) {
            piece = "Bishop";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.ROOK || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.ROOK) {
            piece = "Rook";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KNIGHT || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KNIGHT) {
            piece = "Knight";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.QUEEN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.QUEEN) {
            piece = "Queen";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KING || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KING) {
            piece = "King";
        }

        if (iTo == 16) {
            letter = "a";
        } else if (iTo == 17) {
            letter = "b";
        } else if (iTo == 18) {
            letter = "c";
        } else if (iTo == 19) {
            letter = "d";
        } else if (iTo == 20) {
            letter = "e";
        } else if (iTo == 21) {
            letter = "f";
        } else if (iTo == 22) {
            letter = "g";
        } else if (iTo == 23) {
            letter = "h";
        }


    } else if ((iTo >= 24) && (iTo <= 31)) {
        number = "5";
        if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.PAWN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.PAWN) {
            piece = "Pawn";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.BISHOP || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.BISHOP) {
            piece = "Bishop";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.ROOK || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.ROOK) {
            piece = "Rook";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KNIGHT || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KNIGHT) {
            piece = "Knight";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.QUEEN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.QUEEN) {
            piece = "Queen";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KING || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KING) {
            piece = "King";
        }

        if (iTo == 24) {
            letter = "a";
        } else if (iTo == 25) {
            letter = "b";
        } else if (iTo == 26) {
            letter = "c";
        } else if (iTo == 27) {
            letter = "d";
        } else if (iTo == 28) {
            letter = "e";
        } else if (iTo == 29) {
            letter = "f";
        } else if (iTo == 30) {
            letter = "g";
        } else if (iTo == 31) {
            letter = "h";
        }


    } else if ((iTo >= 32) && (iTo <= 39)) {
        number = "4";
        if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.PAWN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.PAWN) {
            piece = "Pawn";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.BISHOP || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.BISHOP) {
            piece = "Bishop";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.ROOK || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.ROOK) {
            piece = "Rook";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KNIGHT || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KNIGHT) {
            piece = "Knight";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.QUEEN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.QUEEN) {
            piece = "Queen";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KING || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KING) {
            piece = "King";
        }

        if (iTo == 32) {
            letter = "a";
        } else if (iTo == 33) {
            letter = "b";
        } else if (iTo == 34) {
            letter = "c";
        } else if (iTo == 35) {
            letter = "d";
        } else if (iTo == 36) {
            letter = "e";
        } else if (iTo == 37) {
            letter = "f";
        } else if (iTo == 38) {
            letter = "g";
        } else if (iTo == 39) {
            letter = "h";
        }


    } else if ((iTo >= 40) && (iTo <= 47)) {
        number = "3";
        if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.PAWN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.PAWN) {
            piece = "Pawn";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.BISHOP || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.BISHOP) {
            piece = "Bishop";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.ROOK || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.ROOK) {
            piece = "Rook";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KNIGHT || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KNIGHT) {
            piece = "Knight";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.QUEEN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.QUEEN) {
            piece = "Queen";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KING || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KING) {
            piece = "King";
        }

        if (iTo == 40) {
            letter = "a";
        } else if (iTo == 41) {
            letter = "b";
        } else if (iTo == 42) {
            letter = "c";
        } else if (iTo == 43) {
            letter = "d";
        } else if (iTo == 44) {
            letter = "e";
        } else if (iTo == 45) {
            letter = "f";
        } else if (iTo == 46) {
            letter = "g";
        } else if (iTo == 47) {
            letter = "h";
        }


    } else if ((iTo >= 48) && (iTo <= 55)) {
        number = "2";
        if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.PAWN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.PAWN) {
            piece = "Pawn";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.BISHOP || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.BISHOP) {
            piece = "Bishop";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.ROOK || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.ROOK) {
            piece = "Rook";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KNIGHT || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KNIGHT) {
            piece = "Knight";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.QUEEN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.QUEEN) {
            piece = "Queen";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KING || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KING) {
            piece = "King";
        }

        if (iTo == 48) {
            letter = "a";
        } else if (iTo == 49) {
            letter = "b";
        } else if (iTo == 50) {
            letter = "c";
        } else if (iTo == 51) {
            letter = "d";
        } else if (iTo == 52) {
            letter = "e";
        } else if (iTo == 53) {
            letter = "f";
        } else if (iTo == 54) {
            letter = "g";
        } else if (iTo == 55) {
            letter = "h";
        }


    } else if ((iTo >= 56) && (iTo <= 63)) {
        number = "1";
        if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.PAWN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.PAWN) {
            piece = "Pawn";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.BISHOP || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.BISHOP) {
            piece = "Bishop";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.ROOK || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.ROOK) {
            piece = "Rook";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KNIGHT || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KNIGHT) {
            piece = "Knight";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.QUEEN || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.QUEEN) {
            piece = "Queen";
        } else if (_jni.pieceAt(BoardConstants.WHITE, iTo) == BoardConstants.KING || _jni.pieceAt(BoardConstants.BLACK, iTo) == BoardConstants.KING) {
            piece = "King";
        }

        if (iTo == 56) {
            letter = "a";
        } else if (iTo == 57) {
            letter = "b";
        } else if (iTo == 58) {
            letter = "c";
        } else if (iTo == 59) {
            letter = "d";
        } else if (iTo == 60) {
            letter = "e";
        } else if (iTo == 61) {
            letter = "f";
        } else if (iTo == 62) {
            letter = "g";
        } else if (iTo == 63) {
            letter = "h";
        }
    }

    join = letter + number + "" + piece;

    //Log.d("Chess", join);

    _chessActivity.soundNotification(join);


}


public int getIndexOfButton(View but){
    for(int i = 0; i < 64; i++){
        if(_arrImages[i] == ((ChessImageView)but)){

            _arrImages[i].setPressed(false);
            return i;
        }
    }
    return -1;
}
public boolean onTouch(视图v,运动事件){
//_手势检测器。onTouchEvent(事件);
int eventAction=event.getAction();
//您可能需要x/y位置
int x=(int)event.getRawX();
int y=(int)event.getRawY();
点boardPos=getBoardIndexX(新点(x,y));
//将代码放在此处以处理事件
开关(事件操作){
case MotionEvent.ACTION\u DOWN:
Log.d(“国际象棋”,“下棋:+x+”,“+y+”[“+boardPos.x+”,“+boardPos.y+”]);
if(车载(boardPos))
{
//然后玩
lastPlayTime=System.currentTimeMillis();
lastPlayPos.x=板位置x;
lastPlayPos.y=板位置y;
响应坐标(v);
}
break;//返回true;
case MotionEvent.ACTION\u UP:
Log.d(“国际象棋”,“向上:+x+”,“+y+”[“+boardPos.x+”,“+boardPos.y+”]);
lastPlayPos.x=-1;
lastPlayPos.y=-1;
v、 performClick();
break;//返回true;
case MotionEvent.ACTION\u移动:
if(boardPos.x!=lastPlayPos.x | | boardPos.y!=lastPlayPos.y){
//然后我们在一个新的广场上
日志d(“象棋”,“移动:+x+”,“+y+”[“+boardPos.x+”,“+boardPos.y+”]);
lastPlayPos.x=板位置x;
lastPlayPos.y=板位置y;
if(车载(boardPos))
{
//然后玩
lastPlayTime=System.currentTimeMillis();
响应坐标(v);
}
}
}
//告诉视图重新绘制画布
//使无效();
返回true;//super.onTouchEvent(事件);
}
公共void响应坐标(视图v){
int iTo=getIndexOfButton(v);
字符串join=“”;
字符串字母=”;
字符串编号=”;
弦乐片=”;

如果((iTo>=0)&&(iTo=8)&(iTo=16)&&(iTo=24)&(iTo=32)&(iTo=40)&(iTo=48)&(iTo=56)&(iTo这需要检查,但我相信,如果你在一个动作之前离开一个视图,你仍然会得到该视图的一个动作,因此你的视图v始终是你的动作之前的视图,即使你继续另一个动作

这可能是预期的行为

我想他们可能会证实这一点。不过,他们的解决方案可能不适合您的情况,因为您将获得您所接触的所有视图的输出,而不仅仅是当前视图的输出


这是一个问题,但我认为解决方案是在网格上有一个监听器,而不是在单元格上,并找出您从x和y接触的单元格。

我认为我正确理解了这个问题。您假设传递给
onTouch
视图是棋盘上64个视图之一,但事实并非如此e
View
传递给
onTouch
是您将
OnTouchListener
设置为打开的
视图。在本例中,它是棋盘本身

相反,您应该使用
MotionEvent
的坐标来查找单个工件的索引

private int mLastChildIndex = -1;

public boolean onTouch(View view, MotionEvent event) {
    int x = (int) event.getRawX();
    int y = (int) event.getRawY();

    switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mLastChildIndex = getChildIndex((ViewGroup) view, x, y);
            playNotificationForIndex(mLastChildIndex);
            break;
        case MotionEvent.ACTION_MOVE:
            int currentIndex = getChildIndex((ViewGroup) view, x, y);
            if (currentIndex != mLastChildIndex) {
                playNotificationForIndex(currentIndex);
                mLastChildIndex = currentIndex;
            } break;
        case MotionEvent.ACTION_UP:
            performClickForIndex(mLastChildIndex);
            mLastChildIndex = -1;
            break;
    }

    return true; // This method eats all MotionEvent actions for the View
}

private int getChildIndex(ViewGroup viewGroup, int x, int y) {
    for (int i = 0; i < viewGroup.getChildCount(); i++) {
        View child = viewGroup.getChildAt(i);

        int[] coordinates = new int[2];
        child.getLocationOnScreen(coordinates);

        Rect bounds = new Rect(coordinates[0], coordinates[1],
                coordinates[0] + child.getWidth(), coordinates[1] + child.getHeight());
        if (bounds.contains(x, y)) {
            return i;
        }
    } return -1;
}
private int mLastChildIndex=-1;
公共布尔onTouch(视图、运动事件){
int x=(int)event.getRawX();
int y=(int)event.getRawY();
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
mLastChildIndex=getChildIndex((视图组)视图,x,y);
playNotificationForIndex(mLastChildIndex);
打破
case MotionEvent.ACTION\u移动:
int currentIndex=getChildIndex((视图组)视图,x,y);
if(currentIndex!=mLastChildIndex){
播放索引通知(当前索引);
mLastChildIndex=当前索引;
}中断;
case MotionEvent.ACTION\u UP:
performClickForIndex(mLastChildIndex);
mLastChildIndex=-1;
打破
}
return true;//此方法将吃掉视图的所有MotionEvent操作
}
私有int getChildIndex(视图组视图组,int x,int y){
对于(int i=0;i
我应该注意,action\u down每次都会生成正确的值,因此它与我创建的方法无关。看起来它与
respondCoordinates()完全相关
方法。您提到
操作_DOWN
生成正确的值,但是正确的值是什么?
x
y
?但是
响应坐标()
方法不采用
x
y
坐标,而是采用
视图
;因此,如果该方法产生了错误的值,似乎一定是它导致了问题。我建议发布
响应坐标()
method,并更深入地了解您正试图实现的目标。@Bryan我已附上响应坐标(v)代码。我想做的是给屏幕上的不同按钮视图分配一个字母、数字和片段。然后将其返回到onTouch,以便用户可以在屏幕上拖动手指,它将读出不同的