Могу ли я использовать motionEvent .getRawY () с View. getTop ()? - PullRequest
1 голос
/ 18 февраля 2012

Я создаю программу для игры Go и пытаюсь написать код, позволяющий человеку разместить бусинку, которая на самом деле просто показывает невидимую бусинку. Но после часа работы с ним я просто не могу понять, почему координата Y моего события всегда кажется на 2 строки ниже, чем нужно.

Мой код для заполнения моего массива

for(int y=0; y< 9;y++)
    {
        for(int x=0;x<9;x++)
        {
        String name="Whitebead" + ((9*y)+x+2); //The +2 is because of a naming problem
        WhitePieces[x][y]=(ImageView) findViewById(getResources().getIdentifier(name, "id", getPackageName()));
        }

    }

Мой код для обработки событий движения

    @Override
public boolean onTouchEvent(MotionEvent e)
{

         if(e.getAction() == MotionEvent.ACTION_DOWN)
         {
             float X=e.getRawX();
             float Y=e.getRawY();

             if(X>Board.getLeft() && X<Board.getRight())
                 if(Y< Board.getTop() && Y>Board.getBottom());
                    player1.placepiece(X, Y);

         }
         return super.onTouchEvent(e);
}

И, наконец, мой код, который разрешает, какой шарик с какой координатой

    public void placepiece(float X, float Y)
{
    int[] pieceindex=resolvePiece(X,Y);

    pieces[pieceindex[0]][pieceindex[1]].setVisibility(ImageView.VISIBLE);

}


private int[] resolvePiece(float x, float y) {

    int Xindex=0;
    int[] oldcoords= new int[2]; //cordinates are like so {xCoord, Ycoord}
    int[] newcoords= new int[2];
    oldcoords[0]=pieces[0][0].getLeft(); //set the oldcoordinates to the first index
    oldcoords[1]=pieces[0][0].getTop();
    for(int i=1; i<9;i++) //go through the 9 indexs to find the closest X value
    {
        newcoords[0]=pieces[i][0].getLeft();
        newcoords[1]=pieces[i][0].getTop();
        if(Math.abs((int)x-newcoords[0])<Math.abs((int)x-oldcoords[0]))
        {
            Xindex=i;
            oldcoords[0]=newcoords[0];
        }
    }

    int Yindex=0;
    oldcoords[0]=pieces[0][0].getLeft(); //Reset oldcoords again
    oldcoords[1]=pieces[0][0].getTop();
    for(int n=1; n<9;n++) //Go through the 9 indexes for the closest Y value
    {
        newcoords[0]=pieces[0][n].getLeft();
        newcoords[1]=pieces[0][n].getTop();
        if(Math.abs((int)y-newcoords[1])<Math.abs((int)y-oldcoords[1]))
        {
            Yindex=n;   
            oldcoords[1]=newcoords[1];
        }

    }

    int[] rInt= new int[]{Xindex,Yindex};
    return rInt;
}

////// РЕДАКТИРОВАТЬ: Исправлено Я понял это, в верхней части окна андроида около дюйма пространства, где идет заголовок, время работы от батареи и прочее, когда вы получаете координаты движения, это занимает весь экран, где .getTop () только откуда-то линейный Макет начинается. Поэтому вместо использования .getTop или .getLeft я использовал .getLocationInWindow (oldcoord []), и он помещает необходимую информацию в мой массив oldcoord.

1 Ответ

1 голос
/ 20 февраля 2012

////// РЕДАКТИРОВАТЬ: Исправлено Я понял это, в верхней части окна андроида около дюйма пространства, где идут заголовок, время работы от батареи и прочее, когда вы получаете координаты движения, это занимает в целомэкран, где .getTop () получает только откуда начинается линейное расположение.Поэтому вместо использования .getTop или .getLeft я использовал .getLocationInWindow (oldcoord []), и он помещает необходимую информацию в мой массив oldcoord.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...