OnClickListener - x, y местоположение события?

У меня есть пользовательский вид, полученный из представления. Я хочу, чтобы вас уведомили, когда щелкнули изображение, и местоположение x, y, где произошел щелчок. То же самое для длинных кликов.

Похоже, мне нужно переопределить onTouchEvent(). Нет ли способа получить местоположение x, y события из OnClickListener вместо этого?

Если нет, то какой хороший способ сказать, является ли событие движения "реальным" кликом и длинным кликом и т.д.? onTouchEvent генерирует много событий в быстрой последовательности и т.д.

Ответ 1

Спасибо. Это именно то, что я искал. Теперь мой код:

imageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN){
                textView.setText("Touch coordinates : " +
                        String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
            }
            return true;
        }
    });

который делает именно то, о чем просил Марк...

Ответ 2

Переопределить onTouchEvent (MotionEvent ev)

Затем вы можете сделать:

ev.getXLocation()

Или что-то в этом роде. Имейте шарики.

Ответ 3

Полный пример

В других ответах отсутствуют некоторые детали. Вот полный пример.

public class MainActivity extends AppCompatActivity {

    // class member variable to save the X,Y coordinates
    private float[] lastTouchDownXY = new float[2];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // add both a touch listener and a click listener
        View myView = findViewById(R.id.my_view);
        myView.setOnTouchListener(touchListener);
        myView.setOnClickListener(clickListener);
    }

    // the purpose of the touch listener is just to store the touch X,Y coordinates
    View.OnTouchListener touchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            // save the X,Y coordinates
            if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
                lastTouchDownXY[0] = event.getX();
                lastTouchDownXY[1] = event.getY();
            }

            // let the touch event pass on to whoever needs it
            return false;
        }
    };

    View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // retrieve the stored coordinates
            float x = lastTouchDownXY[0];
            float y = lastTouchDownXY[1];

            // use the coordinates for whatever
            Log.i("TAG", "onLongClick: x = " + x + ", y = " + y);
        }
    };
}

Резюме

  • Добавить переменную класса для хранения координат
  • Сохраните координаты X, Y с помощью OnTouchListener
  • Доступ к координатам X, Y в OnClickListener