¿Cómo puedo reconocer qué área de una imagen (no sólo las coordenadas) se ha tocado en Android?

Actualmente estoy desarrollando una aplicación para Android para mi proyecto de fin de año que debería ayudar a las personas autistas a indicar cuando algo duele y hacerlo tocando una imagen del cuerpo humano.

El problema que he encontrado es que no sé cómo identificar la parte de la imagen que tocan. La imagen es un mapa de bits, mantenido como un BitmapDrawable en un ImageView. La primera vez que se toca, se amplía a través de una animación y setFilledAfter (true), y desde allí cuando se toca un área se supone que la aplicación reconoce partes principales del cuerpo (por ejemplo, cabeza, mano izquierda …).

Las áreas a reconocer no son cuadradas, por lo que la comprobación de coordenadas no es realmente una opción. Yo estaba pensando en las líneas de tener cada parte para ser reconocido como una visión diferente dibujada en la parte superior de la imagen original, pero estoy abierto también otras soluciones.

Para hacer las cosas un poco más interesantes, la aplicación debería funcionar en diferentes dispositivos y resoluciones, tanto en móviles como en tabletas.

Muchas gracias de antemano por su ayuda. Es realmente necesario y apreciado.

EDITAR

Al final, lo que intentaré es lo siguiente. Voy a tener dos copias de la imagen, una para mostrar, otra interna, con las áreas que quiero reconocer pintadas en diferentes colores. Así que el plan es extrapolar las coordenadas que obtengo del evento Touch para averiguar a qué píxel corresponde en relación con el original, el uso de Bitmap.getPixel () para determinar cuál es el color, entonces tiene una instrucción case devolviendo el Cadena de cada parte.

Estoy codificando esto ahora, si alguien está interesado dejar un mensaje y voy a publicar cómo todo salió a la luz, y que alguien le pide que incluso el código apropiado: D

Gracias a Shade por darme algunas otras opciones a considerar.

2 Solutions collect form web for “¿Cómo puedo reconocer qué área de una imagen (no sólo las coordenadas) se ha tocado en Android?”

Sin haber pensado demasiado en esto, parece que su idea – para detectar toques con vistas superpuestas – parece ser buena.

Aparte de eso, las coordenadas son también una buena idea – sólo tienes que definir las áreas con nombre de la imagen y comprobar si el punto de contacto está dentro de un área determinada. Podría ser un poco más tedioso, pero puede ser mejor en términos de complejidad en comparación con tener 20 puntos de vista. También será más rápido que añadir 20 vistas adicionales en su aplicación.

Pero, sobre todo, creo que deberías experimentar y ver qué es lo adecuado para tu situación concreta, porque todo lo demás es adivinar.

EDITAR:

Si opta por utilizar el método polígono, entonces tendrá que lidiar con el problema de determinar si un punto está dentro de un polígono ( vea aquí una breve explicación).

Además, con respecto a las vistas, una vista en Android se define como un "área rectangular que ocupa espacio en la pantalla". Por lo tanto, se elimina la posibilidad de vistas no rectangulares. Tal vez haya la posibilidad de que defina un área no rectangular dentro de una Vista, pero no sé si es posible.

@ Alex, gracias por tu idea, me ha ayudado. Esa es mi implementación de su solución

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView imgView = (ImageView)this.findViewById(R.id.main_screen); imgView.setOnTouchListener(this); } @Override public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.red); switch(action) { case MotionEvent.ACTION_DOWN: int x = (int)event.getX(); int y = (int)event.getY(); int color = bMap.getPixel(x, y) ; ImageView testimage = (ImageView) findViewById(R.id.main_screen); switch(color) { case Color.RED: testimage.setImageDrawable(getResources().getDrawable(R.layout.red)); break; case Color.BLUE: testimage.setImageDrawable(getResources().getDrawable(R.layout.blue)); break; } break; case MotionEvent.ACTION_UP: int x1 = (int)event.getX(); int y1 = (int)event.getY(); color = bMap.getPixel(x1, y1) ; testimage = (ImageView) findViewById(R.id.main_screen); testimage.setImageResource(R.drawable.draw); // TODO: Rename constant upper-case. final int red = 1; final int blue = 2; switch(color){ case Color.RED: Intent i = new Intent(this, NewActivity.class); i.putExtra(NewActivity.EXT_COLOR, red); startActivity(i); break; case Color.BLUE: i = new Intent(this, NewActivity.class); i.putExtra(NewActivity.EXT_COLOR, blue); startActivity(i); break; } break; case MotionEvent.ACTION_MOVE: x = (int) event.getX(); y = (int)event.getY(); testimage = (ImageView) findViewById(R.id.main_screen); color = bMap.getPixel(x, y); switch(color){ case Color.RED: testimage.setImageDrawable(getResources().getDrawable(R.layout.red)); break; case Color.BLUE: testimage.setImageDrawable(getResources().getDrawable(R.layout.blue)); break; default: testimage = (ImageView) findViewById(R.id.main_screen); testimage.setImageResource(R.drawable.draw); break; } break; } return true; } 
  • Vista de la actividad actual de Fade Out
  • Obtener el ancho / altura de la vista o el ancho / altura / otros tamaños de la fuente antes de la primera visualización
  • Android: Tutorial sobre la creación de vistas personalizadas
  • Acceso a TextView desde otra clase
  • Stream de video de autorrotación TextureView en Nexus4 (pero no en Galaxy S4)
  • Cómo configurar un mapa de bits como fondo para una vista Android API 10-18?
  • Android: Elementos de interfaz de usuario sobre capa de lienzo
  • Cambiar el color del cursor de searchView
  • Android - Creación de listview con encabezados flotantes
  • Android: establece las pestañas predeterminadas pero sin ningún contenido
  • Vista de Android establecida en Visible y Gone en el mismo método OnClick, View nunca mostrando Visible
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.