У меня есть собственный вид, полученный из View. Я хотел бы получать уведомления о щелчке по представлению и о координатах x, y, где произошел щелчок. То же и для длинных кликов.
Похоже, для этого мне нужно переопределить onTouchEvent()
. Однако нет ли способа получить координаты события x, y из a OnClickListener
?
Если нет, то как лучше всего определить, является ли событие движения «настоящим» щелчком по сравнению с длительным щелчком и т. Д.? onTouchEvent
Генерирует множество событий в быстрой последовательности и т.д.
false
чтобы не блокировать события касания? (View.OnTouchListener.onTouch возвращает true, если слушатель обработал событие, иначе false.)OnClickListener
как срабатывает, когда палец отпущен,ACTION_UP
но с ограничениями: если был выполнен жест перемещения (смахивания), тоOnClickListener
он не запускается, ноACTION_UP
все равно будет обрабатываться.(event.getX(), event.getY())
но он пишет не в правильном месте.Полный пример
В других ответах отсутствуют некоторые детали. Вот полный пример.
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); } }; }
Резюме
OnTouchListener
OnClickListener
источник
Переопределить onTouchEvent (MotionEvent ev)
Тогда вы сможете:
ev.getXLocation()
Или что-то вроде того. Есть бутерброды.
источник
Вы можете создать функцию расширения в Kotlin, например:
fun View.setOnClickListenerWithPoint(action: (Point) -> Unit) { val coordinates = Point() val screenPosition = IntArray(2) setOnTouchListener { v, event -> if (event.action == MotionEvent.ACTION_DOWN) { v.getLocationOnScreen(screenPosition) coordinates.set(event.x.toInt() + screenPosition[0], event.y.toInt() + screenPosition[1]) } false } setOnClickListener { action.invoke(coordinates) } }
Если нужен долгий клик - просто замените
setOnClickListener
Я использую,
getLocationOnScreen()
потому что мне нужны координаты для ViewHolder RecyclerViewисточник