2011-03-07 8 views
6

Actualmente estoy desarrollando una aplicación Android para mi proyecto final de lo que debería ayudar a las personas autistas indican cuando algo duele y ello, toque una imagen del cuerpo humano.¿Cómo puedo reconocer qué área de una imagen (no solo coordenadas) se ha tocado en Android?

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, que se mantiene como mapa de bits en un ImageView. La primera vez que se toca, se amplía a través de una animación y estableceFilledAfter (true), y desde allí cuando se toca un área, la aplicación debe reconocer las partes principales del cuerpo (por ejemplo, cabeza, mano izquierda ...).

Las áreas a ser reconocidos no son cuadrados lo que la comprobación de coordenadas no es realmente una opción. Estaba pensando en hacer que cada parte sea reconocida como una vista diferente dibujada en la parte superior de la imagen original, pero también estoy abierto a otras soluciones.

Para hacer las cosas un poco más interesante la aplicación deben trabajar en diferentes dispositivos y resoluciones, tanto en los móviles y tabletas.

Gracias por lo mucho de antemano por su ayuda. Es realmente necesario y apreciado.

EDITAR

Al final lo que estaré tratando es la siguiente. Voy a tener dos copias de la imagen, una para mostrar, otra interna, con las áreas que quiero reconocidas pintadas en diferentes colores. Entonces, 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 el color que es, luego tener una declaración de caso que devuelve el Cadena de cada parte.

estoy codificar esta en este momento, si alguien está interesado dejar un mensaje y voy a publicar cómo funcionaba todo, y yo alguien le pide que sea aún el código apropiado: D

Gracias a Shade por darme alguna otras opciones a considerar.

+1

@ user647899, una muy buena idea! Publique su solución para que otros se beneficien si se topan con el mismo problema. – Shade

Respuesta

2

Sin haber pensado mucho sobre esto, parece que su idea - para detectar toques con superposición Vistas - parece ser bueno.

Aparte de eso, las coordenadas también son una buena idea: solo tiene que definir á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 si se compara con tener 20 vistas. También será definitivamente más rápido que agregar 20 vistas adicionales en su aplicación.

Pero sobre todo, creo que debes experimentar y ver qué es lo más adecuado para tu situación concreta, porque todo lo demás es conjetura.

EDIT:

Si decide utilizar el método del polígono, entonces usted va a tener que lidiar con el problema de determinar si un punto está dentro de un polígono (see here para una breve explicación).

Además, con respecto a Vistas, una Vista en Android se define como un "área rectangular que ocupa espacio en la pantalla". Entonces eso elimina la posibilidad de Vistas no rectangulares. Quizás exista la posibilidad de que defina un área seleccionable no rectangular dentro de una Vista, pero no sé si eso es posible.

+0

Gracias por la respuesta rápida. Mi problema con ambas soluciones es que las áreas no son cuadradas (ni rectangulares), por lo que las coordenadas serían realmente problemáticas (intenta definir una mano como conjuntos de coordenadas ...). Del mismo modo, no sé cómo definir Vistas en Android que no son rectangulares, e incluso si hay una manera, ¿cómo voy a mostrarlas? Quiero decir, ¿cómo puedo colocar cada una de estas vistas correctamente sobre la Vista ampliada? Gracias de nuevo. – Alex

+0

@ user647899, ver mi edición. Creo que este problema debería abordarse aquí en otra pregunta, dependiendo del enfoque que elijas usar. Ya hubo preguntas sobre SO sobre el problema de PIP, por lo que solo puede buscar. – Shade

+0

@ user647899, si mi respuesta fue útil, considere marcarla como la respuesta seleccionada para la pregunta. Gracias. – Shade

0

@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; 
    } 
Cuestiones relacionadas