0

Я знаю, что есть некоторые похожие темы, которые были опубликованы, но я не смог найти хорошее решение для своей проблемы.Получите реальную позицию X/Y события onTouch

У меня есть GridView, который хранится с помощью настраиваемого ImageAdapter. Все работает нормально, но всякий раз, когда я нажимаю на изображение, содержащееся в GridView, я хотел бы переместить другое изображение в позицию щелчка. Однако координаты события, которые я принимаю с event.getX() и event.getY(), не соответствуют позиции щелчка.

Сначала я подумал о проблеме преобразования dp/px, и я пробовал несколько решений таким образом, но никто из них не работал. Затем я попытался использовать getXPrecision(), но я не мог сделать рабочего решения ... Возможно, есть другой способ?

Я хотел бы сделать правильное положение программным путем, не добавляя константы int, поэтому мой проект будет работать на разных телефонах и планшетах с различными разрешениями и разрешением.

EDIT: Вот screenshot, где я щелкнул 3-ей ячейкой первой строки и установил положение карандаша с помощью getRawX() - getRawY(). Как мы видим, это не правильная позиция, я хочу, чтобы красная точка (центр изображения) была расположена там, где я нажал.

Код, используемый:

// получение позиции события onTouch:

GridView centre = (GridView) findViewById(R.id.gridView); 
    adapter = new ImageAdapter(this, (dim * dim), tailleCell); 
    centre.setAdapter(adapter); 

    centre.setOnTouchListener(new View.OnTouchListener() { 
     public boolean onTouch(View view, MotionEvent event) { 

      int X = (int)event.getRawX(); 
      int Y = (int)event.getRawY(); 
      animation(X, Y, etat); 
      return false; 
     } 
    });` 

// запускает анимацию (и положение установки карандаша):

private void animation(int posX, int posY, int etat) 
    { 
    final ImageView img; 
    if(etat == 0) 
    { 
     img = (ImageView) findViewById(R.id.imageView); 
    } 
    else 
    { 
     img = (ImageView) findViewById(R.id.imageView2); 
    } 

    img.clearAnimation(); 
    img.setVisibility(View.VISIBLE); 

    img.setX(posX); 
    img.setY(posY); 
    [...] 
    } 

EDIT 2: ~ Решение:

Решение для нашей семьи Молина Родригес Де Вера не работает как e xpected, но мне удалось сделать работоспособное решение. Я только что изменил мой код в обработчик событий для регулировки положения изображения в:

int[] offset = new int[2]; 
centre.getLocationOnScreen(offset); 
int Xoffset=offset[0]; 
int Yoffset = offset[1]; 
int X = (int)event.getRawX(); 
int Y = (int)event.getRawY(); 
animation(X-((int)Math.round(Xoffset/1.15)), Y-((int)Math.round(Yoffset/1.5)), etat); 

Извините за мой плохой английский :)

Спасибо за вашу помощь!

ответ

2

Попробуйте использовать getRawX() и getRawY() вместо getX и getY.

Редактировать

Я думаю, что я нашел эту проблему.

Вы получаете X и Y относительно верхнего левого угла GridView, а не абсолютные координаты экрана.

Что вы можете сделать, это следующее:

int[] offset = new int[2]; 
center.getLocationOnScreen(offset); 
int Xoffset=offset[0]; 
int Yoffset = offset[1]; 

private void animation(int posX, int posY, int etat){ 

//... 

img.setX(posX+Xoffset); 
img.setY(posY+Yoffset); 
[...] 
} 

Это должен установить верхний левый угол ImageView в выбранной точке. Чтобы установить центр в этой точке:

int ivWidth = img.getWidth(); 
int ivHeight = img.getHeight(); 

private void animation(int posX, int posY, int etat){ 

//... 

int[] finalPosition=new int[2]; 
finalPosition[0] = posX+Xoffset-(ivWidth/2); 
finalPosition[1] = posY+Yoffset-(ivHeight/2); 
img.setX(finalPosition[0]); 
img.setY(finalPosition[1]); 
[...] 
} 

Я не пробовал, но он должен работать.

Edit 2

Xoffset и YOffset необходимы только при использовании GetX()/GetY() вместо getRawX()/getRawY()

+0

Извините, но это не сработало, по-прежнему offset ... – Vincesname

+0

Только вопрос. Что вы хотите сделать, так это перемещение одного из изображений в позицию щелкнутого элемента? –

+0

Точно, я хочу получить правильный X-Y, чтобы я мог перемещать вид изображения на эту позицию. Координаты должны исходить из X и Y события click. – Vincesname

Смежные вопросы