Comment savoir si une coordonnée X et Y sont dans mon bouton?

J'ai réussi, avec une grande difficulté, à créer un bitmap sur l'écran. Je peux également obtenir une entrée tactile, mais il reçoit une entrée tactile pour TOUT LIEU sur l'écran.

Je veux savoir comment je vérifier si le contact était sur mon bitmap, visible sur l'écran.

  • La plus petite largeur pour Galaxy S et Galaxy S2
  • Comment renvoyer le projet à un commit précédent dans un studio Android
  • Android fastboot en attente de périphériques
  • Pourquoi mon JsonObjectRequest ne fonctionne-t-il pas?
  • Android: Open Spinner from Button
  • Paramètres du fond d'écran force close
  • Le service et la classe de vue sont ci-dessous. J'ai pensé et pensé, mais je ne pouvais pas penser à un moyen de le faire 🙁

    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; } } 

    5 Solutions collect form web for “Comment savoir si une coordonnée X et Y sont dans mon bouton?”

    Envisagez d'utiliser FrameLayout (ou toute autre sous-classe de ViewGroup ) au lieu de ViewGroup directement. Parce que votre implémentation actuelle de la méthode onLayout n'est pas correcte, ce qui vous conduira à des problèmes d'affichage des vues enfants.

    Maintenant, plus près de votre question. Vous devriez ininitialiser Rect et enregistrer juste la position gauche, supérieure, droite et inférieure de votre Bitmap . Comme je peux le voir, vous êtes actuellement initialisé r variable, mais ne l'utilisez nulle part.

    Ainsi, vous pouvez l'initialiser comme suit:

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

    Maintenant, dans onTouchEvent vous pouvez simplement vérifier:

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

    Vous pouvez utiliser getHitRect (Rect). Il renvoie le rectangle Hit dans les coordonnées des parents. Voici la documentation

    Cela fonctionne pour toute vue

     @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); } 

    Utilisez l'instruction if avec la méthode if(r.contains(x, y)) sur ce bouton que vous souhaitez vérifier. Cette méthode renverra true, lorsque le point x et y est à l'intérieur du rectangle r. Vous pouvez également créer une méthode publique dans cette classe, de sorte que vous pouvez y accéder en dehors de la classe ButtonView avec la référence de l'objet de bouton.

    Lorsque le «événement tactile» se produit, il traverse tout l'arbre de la vue. Fe si vous disposez d'une disposition linéaire et d'ImageView et que l'utilisateur touche l'écran sur ImageView, puis touchez les interceptions d'événements et, d'une part, il sera traité à LinearLayour puis à ImageView.

    Si vous souhaitez bloquer Fe de l'événement sur le bitmap, vous devez remplacer onTouchEvent pour Bitmap et renvoyer la vraie valeur. Cela signifie que vous avez traité cet événement et qu'il ne sera pas disponible pour LinearLayout.

     image.setOnTouchListener( new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { return true; // attentively read documentation for onTouc interface } }); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.