Tengo un tablero de juego con cuadrados de 5x5 hecho de lona, ​​como se muestra a continuación:

protected void onDraw(Canvas canvas) {
    for (int rowNo = 0; rowNo < nSquares; rowNo++) {
        paint.setColor(((rowNo & 1) == 0) ? colorA : colorB);
        for (int colNo = 0; colNo < nSquares; colNo++) {
            int left = colNo * squareWidth;
            int top = rowNo * squareWidth;

            Rect areaRect = new Rect(left, top, left + squareWidth, top + squareWidth);
            canvas.drawRect(areaRect, paint);


            paint.setColor((paint.getColor() == colorA) ? colorB : colorA);

            paint.setTextSize((float)(squareWidth*0.8));

            RectF bounds = new RectF(areaRect);
            String letter = "A";
            bounds.right = paint.measureText(letter, 0, letter.length());
            bounds.bottom = paint.descent() - paint.ascent();

            bounds.left += (areaRect.width() - bounds.right) / 2.0f;
            bounds.top += (areaRect.height() - bounds.bottom) / 2.0f;

            canvas.drawText(letter, bounds.left, bounds.top - paint.ascent(), paint);
        }
    }

Quiero rastrear la entrada táctil para obtener los cuadrados que el usuario está tocando. Mi intento fue

public boolean onTouchEvent(MotionEvent event){ 

    int action = MotionEventCompat.getActionMasked(event);

    int x = (int)event.getX();
    int y = (int)event.getY();
    Log.i(DEBUG_TAG, "Position: (" + x + ", " + y + ")");

    int squareTouched = gameBoard.getSquare(x,y);
}

Donde es getSquare

public int getSquare(int x, int y) {
    int row = 0;
    int col = 0;
    for(int rowNo = 1; rowNo <= nSquares; rowNo++) {
        Log.i("Row", "Width: " + squareWidth + " rowNo: " + rowNo + " rowNo*squareW: " + rowNo*squareWidth + " y: " + y);
        if(rowNo*squareWidth > y)
        {
            row = rowNo;
            break;
        }
    }

    for (int colNo = 1; colNo <= nSquares; colNo++) {
        if(colNo*squareWidth > x)
        {
            col = colNo;
            break;
        }
    }
    Log.i(DEBUG_TAG, "Row: " + row + " Col: " + col);
    return (row-1)*nSquares + col;
}

El problema es que onTouchEvent getX y getY se refieren a la pantalla 0,0, pero cuando dibujo los cuadrados 0,0,0,0 ¿se refiere al origen de la vista? Estoy en lo cierto? ¿Cómo puedo obtener la posición de entrada en relación con la vista del tablero de juego? ¿Podría ser una solución obtener la posición de la vista en la pantalla y sumar / restar esto a la posición xey de tochEvent?

0
EirikO 31 ene. 2015 a las 13:49

2 respuestas

La mejor respuesta

No pude obtener el gameBoard (). GetX / Y () para devolver los valores correctos. ¿Supongo que la barra de acción está excluida?

Ahora uso getLocationOnScreen

    @Override
public boolean onTouchEvent(MotionEvent event){ 

    int action = MotionEventCompat.getActionMasked(event);
    int boardLocation[] = new int[2];
    gameBoard.getLocationOnScreen(boardLocation);

    int touchX = (int)event.getX();
    int touchY = (int)event.getY();

    int x = touchX - boardLocation[0];
    int y = touchY - boardLocation[1];

    int squareTouched = gameBoard.getSquare(x,y);
}

Lo que resolvió mi problema.

0
EirikO 1 feb. 2015 a las 19:10

Supongo que onDraw() y getSquare() pertenecen a GameBoardView y onTouchEvent() a su padre inmediato. Si es así, entonces el onTouchEvent() debería ser así

    public boolean onTouchEvent(MotionEvent event){
          int action = MotionEventCompat.getActionMasked(event);
          int x = (int)event.getX() - gameBoard.getX();
          int y = (int)event.getY() - gameBoard.getY();
          Log.i(DEBUG_TAG, "Position: (" + x + ", " + y + ")");

          int squareTouched = gameBoard.getSquare(x, y);
    }

En una Vista, xey tanto en onDraw() como en onTouchEvent() es relativo a la Vista en sí (excepto cuando la Vista se desplaza). Dado que en su caso onTouchEvent() pertenece al padre y onDraw() al hijo, utilicé View.getX() y getY() para traducir las coordenadas. View.getX() devuelve la posición x más la traducciónX de la Vista relativa a su padre.

0
Durgadass S 1 feb. 2015 a las 08:31