Obtén las coordenadas del botón y detecta si el dedo está sobre ellas – Android

Tengo 4 botones en la actividad de mi aplicación de Android. Esto es lo que parece:

Como puede ver, las textViews en la parte inferior de la pantalla muestran las coordenadas xey. Las coordenadas están en referencia a un diseño relativo. (Ver abajo el código dado)

Ahora, lo que quiero hacer es obtener las coordenadas xey de los 4 botones en tiempo de ejecución y luego averiguar si mi dedo toca los botones mientras se mueve o no. En palabras simples, quiero presionar los botones deslizando mi dedo sobre ellos en lugar de levantarlos y tocarlos. ¿Cómo puedo lograrlo? Quiero implementarlo en mi aplicación para piano.

Pude obtener las coordenadas en la pantalla y cambian a medida que muevo mi dedo.
Entonces, mi pregunta es ¿Cómo puedo obtener las coordenadas de los botones y detectar si mi dedo se desliza sobre ellos? :
XML

     

Java

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView xcordview = (TextView) findViewById(R.id.textView4); final TextView ycordview = (TextView) findViewById(R.id.textView3); RelativeLayout touchview = (RelativeLayout) findViewById(R.id.relativelayout); touchview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { xcordview.setText(String.valueOf(event.getX())); ycordview.setText(String.valueOf(event.getY())); return true; } }); } } 

¡Muchas gracias a todos!

Actualizar:

 public class MainActivity extends Activity { RelativeLayout touchview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final TextView xcordview = (TextView) findViewById(R.id.textView4); final TextView ycordview = (TextView) findViewById(R.id.textView3); touchview = (RelativeLayout) findViewById(R.id.relativelayout); touchview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { xcordview.setText(String.valueOf(event.getX())); ycordview.setText(String.valueOf(event.getY())); for(int i = 0; i < touchview.getChildCount(); i++){ if(checkInterSection(touchview.getChildAt(i), event.getRawX(), event.getRawY())){ Button button = (Button) findViewById(R.id.button); button.setBackgroundColor(Color.BLUE); break; } } return true; } }); } private boolean checkInterSection(View view, float rawX, float rawY) { int[] location = new int[2]; view.getLocationOnScreen(location); int x = location[0]; int y = location[1]; int width = view.getWidth(); int height = view.getHeight(); //Check the intersection of point with rectangle achieved return (!(rawX  x + width || rawY  y + height)); } } 

 package com.example.touch; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.RelativeLayout; import android.widget.TextView; public class MainActivity extends Activity { Button b1, b2, b3, b4; int b1x1, b1x2, b1y1, b1y2; private TextView xcordview; private TextView ycordview; private TextView buttonIndicator; private RelativeLayout touchview; private static int defaultStates[]; private Button mLastButton; private final static int[] STATE_PRESSED = { android.R.attr.state_pressed, android.R.attr.state_focused | android.R.attr.state_enabled }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); xcordview = (TextView) findViewById(R.id.textView4); ycordview = (TextView) findViewById(R.id.textView3); buttonIndicator = (TextView) findViewById(R.id.button_indicator); touchview = (RelativeLayout) findViewById(R.id.relativelayout); b1 = (Button) findViewById(R.id.button1); b2 = (Button) findViewById(R.id.button2); b3 = (Button) findViewById(R.id.button3); b4 = (Button) findViewById(R.id.button4); defaultStates = b1.getBackground().getState(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); touchview.setOnTouchListener(new View.OnTouchListener() { private boolean isInside = false; @Override public boolean onTouch(View v, MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); xcordview.setText(String.valueOf(x)); ycordview.setText(String.valueOf(y)); for (int i = 0; i < touchview.getChildCount(); i++) { View current = touchview.getChildAt(i); if (current instanceof Button) { Button b = (Button) current; if (!isPointWithin(x, y, b.getLeft(), b.getRight(), b.getTop(), b.getBottom())) { b.getBackground().setState(defaultStates); } if (isPointWithin(x, y, b.getLeft(), b.getRight(), b.getTop(), b.getBottom())) { b.getBackground().setState(STATE_PRESSED); if (b != mLastButton) { mLastButton = b; buttonIndicator.setText(mLastButton.getText()); } } } } return true; } }); } @Override public void onWindowFocusChanged(boolean hasFocus) { // TODO Auto-generated method stub super.onWindowFocusChanged(hasFocus); } static boolean isPointWithin(int x, int y, int x1, int x2, int y1, int y2) { return (x <= x2 && x >= x1 && y <= y2 && y >= y1); } } 

archivo de diseño

             
 private boolean checkInterSection(View view, int rawX, int raxY) { int[] location = new int[2]; view.getLocationOnScreen(location); int x = location[0]; int y = location[1]; int width = view.getWidth(); int height = view.getHeight(); //Check the intersection of point with rectangle achieved return (!(rawX < x || rawY > x + width || rawY < y || rawY > y + height)); } for(int i = 0; i < touchview.getChildCount(); i++){ if(checkInterSection(touchview.getChildAt(i), event.getRawX(), event.getRawY())){ if(checkInterSection(touchview.getChildAt(i), event.getRawX(), event.getRawY())){ ((Button)touchview.getChildAt(i)).setBackgroundColor(Color.BLUE);// Type casting may not be required }else{ ((Button)touchview.getChildAt(i)).setBackgroundColor(Color.WHITE); } break; } } 

getX () getY () para un OnTouchListener da coordenadas relativas a la vista cooresponding.

Si prefieres las coordenadas de pantalla, puedes usar una de las siguientes

  • sobrescribir onTouchEvent para la actividad y eliminar OnTouchListener-s para los botones , en cuyo caso MotionEvent informará las coordenadas de la pantalla en lugar de las coordenadas del botón

      @Override public boolean onTouchEvent (MotionEvent event) { xcordview.setText(String.valueOf(event.getX())); ycordview.setText(String.valueOf(event.getY())); return true; } 
  • use getTop () getLeft () en OnTouchListener para un botón:

      touchview.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { xcordview.setText(String.valueOf(event.getX()+v.getLeft())); ycordview.setText(String.valueOf(event.getY()+v.getTop())); return true; } }); 

Puede considerar usar GestureDetector para detectar golpes, sin embargo, no es realmente necesario.