Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在画布上跟踪触摸输入_Android_Canvas_Touch - Fatal编程技术网

Android 在画布上跟踪触摸输入

Android 在画布上跟踪触摸输入,android,canvas,touch,Android,Canvas,Touch,我有一个由帆布drawrect制成的5x5正方形游戏板: 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++) {

我有一个由帆布drawrect制成的5x5正方形游戏板:

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);
        }
    }
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;
}
问题是onTouchEvent getX和getY指的是屏幕0,0,但当我绘制正方形0,0,0,0时,它指的是视图原点?我说得对吗? 如何获取相对于游戏板视图的输入位置? 获取屏幕中的视图位置并将其添加/减去到tochEvent x和y位置是否是一种解决方案?

我假设onDraw和getSquare属于GameBoardView,而onTouchEvent属于其直接父对象。如果是这样,那么onTouchEvent应该是这样的

    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);
    }

在视图中,onDraw和onTouchEvent中的x和y都是相对于视图本身的,滚动视图时除外。因为在您的例子中,onTouchEvent属于父对象,onDraw属于子对象,所以我使用View.getX和getY来转换坐标。View.getX返回视图相对于其父视图的x位置加平移x。

我无法让gameBoard.getX/Y返回正确的值。我猜动作栏被排除在外了

我现在在屏幕上使用getLocationOnScreen

解决了我的问题

    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);
    }
    @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);
}