2017-04-13 100 views
0

我試圖調用一個方法在每次調用ACTION_MOVE時使用不同的值更新tt​​s元素。但是,每次調用時都會返回相同的值。 respondCoordinates(v)方法有一個if語句來更改值。ACTION_MOVE每次在OnTouch中調用時都返回相同的值

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; 
} 
+0

我要指出,ACTION_DOWN產生正確的值,每次所以它是沒有任何關係,我創建的方法 – Andrew

+0

它看起來像它有*一切*做'respondCoordinates()'方法。你提到'ACTION_DOWN'產生正確的值,但是正確的值是什麼? 'x'和'y'?但是'respondCoordinates()'方法不需要'x'和'y'座標,它需要'View';所以如果這種方法產生了錯誤的價值,似乎它一定是造成這個問題的原因。我建議發佈'respondCoordinates()'方法,並且更深入地探討你試圖達到的目標。 – Bryan

+0

@Bryan我已附上響應協調員(v)代碼。我想要做的是給屏幕上的不同按鈕視圖分配一個字母,數字和小片。然後將其返回到onTouch,以便用戶可以在屏幕上拖動他們的手指並讀出棋盤上的不同位置。 – Andrew

回答

0

我想我正確理解了這個問題。您假設傳遞給onTouchView是棋盤上64個視圖中的一個,但事實並非如此。 View傳遞給onTouch是您設置OnTouchListenerView。在這種情況下,它就是棋盤本身。

相反,您應該通過使用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; 
} 
+0

認爲我的導師告訴我,你做之前完全一樣的事情。現貨上,你是正確的 – Andrew

0

需要進行檢查,但我相信,如果你的ACTION_UP之前留下一個視圖,你仍然可以爲該視圖的ACTION_MOVE,讓您的視圖V始終是你對你的ACTION_DOWN的一個,即使你移動另一個。

這可能是預期的行爲。

我認爲this可能會證實它。他們的解決方案可能不適合你的情況,因爲你會得到一個輸出,而不是隻有當前的一個。

這很煩人,但我認爲解決方案是在網格上有一個偵聽器,而不是在單元格上,並找出您從x和y觸摸哪個單元格。

相關問題