¿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.
- Regex no funciona en Android pero funciona bien en Java
- WebView no se desplazará en Android 2.x
- Cuenta de método jar / dex Android en ventanas
- Encriptación de Android
- Parse JSON sin sucesión de bloques Try-Catch
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; } }
- Causado por: java.lang.IllegalStateException: ¿paquete no instalado?
- Base64 codificar archivo de audio y enviar como una cadena y luego decodificar la cadena
- Mostrar imágenesVistas con tema de animación
- Asegúrese de que las fotos se guardan con la misma orientación que se tomaron?
- Widget de conmutador vertical Android
- Cómo compartir el diseño IDE en IntelliJ IDEA?
- ¿Cómo obtener un cuerpo de respuesta para la excepción de actualización?
- ¿Cómo establecer la posición del diálogo?
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 } });
- ¿Cuál es el meanining de 3 puntos en parámetros de función?
- Proyecto Android: Problema de exportación Lanzamiento cancelado! Proguard devuelto con el código de error 1. Consulte consola