¿Cómo saber si una coordenada X e Y están dentro de mi botón?

He logrado, con gran dificultad, hacer una superposición de mapa de bits en la pantalla. Puedo también conseguir la entrada del tacto, sin embargo consigue entrada del tacto para CADA VEZ en la pantalla.

Quiero saber cómo podría comprobar si el tacto estaba en mi mapa de bits, que es visible en la pantalla.

La clase de servicio y vista está debajo. He pensado y pensado, pero no podía pensar en una manera de hacerlo 🙁

package <package>; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Rect; import android.os.IBinder; import android.support.v4.app.NotificationCompat; import android.view.Gravity; import android.view.MotionEvent; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.Toast; public class MyService extends Service { ButtonView mView; Bitmap bit; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); bit = BitmapFactory.decodeResource(getResources(), R.drawable.button); NotificationCompat.Builder builder = new NotificationCompat.Builder( this); builder.setContentTitle("Ingress Tools Running"); builder.setContentText("Click to stop Ingress Tools"); builder.setSmallIcon(R.drawable.ic_launcher); builder.setContentIntent(PendingIntent.getActivity(this, 0, new Intent( this, StopActivity.class), 0)); NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(1, builder.build()); mView = new ButtonView(this, bit); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.FILL_PARENT, WindowManager.LayoutParams.FILL_PARENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); params.gravity = Gravity.RIGHT; params.setTitle("Load Average"); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.addView(mView, params); } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(getBaseContext(), "onDestroy", Toast.LENGTH_LONG).show(); if (mView != null) { ((WindowManager) getSystemService(WINDOW_SERVICE)) .removeView(mView); mView = null; } } } class ButtonView extends ViewGroup { private Paint mLoadPaint; private Rect r; private Bitmap bit; public ButtonView(Context context, Bitmap bit) { super(context); Toast.makeText(context, "HUDView", Toast.LENGTH_LONG).show(); mLoadPaint = new Paint(); mLoadPaint.setAntiAlias(true); mLoadPaint.setTextSize(10); mLoadPaint.setARGB(255, 255, 0, 0); r = new Rect(); r.set(380, 134, 468, 213); this.bit = bit; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //canvas.drawColor(Color.BLACK); canvas.drawBitmap(bit, 100, 100, null); } @Override protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { } @Override public boolean onTouchEvent(MotionEvent event) { int area = bit.getWidth() * bit.getHeight(); //if (event.getY() <= maxY && event.getX() <= maxX) { Toast.makeText(getContext(), "Open tools: ", Toast.LENGTH_LONG) .show(); //} return true; } } 

Considere el uso de FrameLayout (o cualquier otra subclase de ViewGroup ) en lugar de ViewGroup directamente. Debido a que su implementación actual del método onLayout no es correcta, lo que le llevará a problemas con la visualización de las vistas secundarias.

Ahora, más cerca de su pregunta. Debe ininitializar Rect y sólo almacenar la izquierda, superior, derecha y la posición inferior de su Bitmap de Bitmap . Como puedo ver, actualmente estás inicializado r variable, pero no lo usas en ninguna parte.

Por lo tanto, puede inicializar de esta manera:

 r = new Rect(100, 100, 100 + bit.getWidth(), 100 + bit.getHeight()); 

Ahora en onTouchEvent puedes comprobar:

 r.contains((int) event.getX(), (int) event.getY()); 
 Rect rect = new Rect(); getHitRect(rect); if (rect.contains((int) event.getX(), (int) event.getY())) {} 

Puede utilizar getHitRect (Rect). Devuelve el rectángulo Hit en las coordenadas de los padres. Aquí la documentación

Esto funciona para cualquier vista

 @Override public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { if (inViewInBounds(myButtonView, (int) event.getRawX(), (int) event.getRawY())) { // User moved outside bounds Log.e("dispatchTouchEvent", "you touched inside button"); } else { Log.e("dispatchTouchEvent", "you touched outside button"); } } return super.dispatchTouchEvent(event); } Rect outRect = new Rect(); int[] location = new int[2]; private boolean inViewInBounds(View view, int x, int y) { view.getDrawingRect(outRect); view.getLocationOnScreen(location); outRect.offset(location[0], location[1]); return outRect.contains(x, y); } 

Utilice la instrucción if con el método if(r.contains(x, y)) en el botón que desea comprobar. Este método devolverá true, cuando xey el punto está dentro del rectángulo r. También puede hacer que el método público dentro de esa clase, por lo que puede acceder a él fuera de la clase ButtonView con la referencia del objeto del botón.

Cuando el "evento táctil" sucede, está atravesando el árbol de todas las vistas. Fe si tiene un diseño Linear y ImageView en él y el usuario toca la pantalla en ImageView, luego toca los eventos interceptados y en primer lugar se manejará en LinearLayour y luego en ImageView.

Si desea bloquear el evento fe en el mapa de bits, debe sobrescribir onTouchEvent para Bitmap y devolver valor verdadero. Esto significa que ha manejado este evento y no estará disponible para LinearLayout.

 image.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return true; // attentively read documentation for onTouc interface } }); 
  • Cómo mostrar sólo el mes actual en la vista de calendario de Android
  • Reproducir un archivo m3u8 local en android mostrando setDataSourceFD failed .: status = 0x80000000
  • Android GCM: forma diferente de gestionar el envío dependiendo de si la aplicación es visible o no
  • ¿Por qué no desaparece el teclado virtual?
  • Cómo obtener pruebas simples de JUnit para ejecutarse en Android Studio
  • Métodos estáticos o Singletons rendimiento-sabio (Android)?
  • Recyclerview cambia la posición del artículo automáticamente cuando se desplaza
  • ¿Cómo incluir dependencias en el proyecto de gradol de la biblioteca android?
  • Ocultar teclado cuando se envía una búsqueda o se elige una sugerencia de búsqueda
  • Respecto a la serialización, serialVersionUID y clase incompatible
  • ¿Cómo combinar, crear etiquetas y poner un orden ascendente los feeds de más RSS Feed enlaces como en Yahoo Pipes?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.