Cómo evitar el método onClick en la parte transparente de un ImageView cargado de PNG

Actualmente estoy desarrollando una aplicación para Android que muestra varias imágenes (como ImageView's ) apiladas unas encima de otras. A continuación, se muestra cómo se configuran las capas:

  • Capa de fondo: escala toda la pantalla, debe ser clicable
  • Capa de primer plano: escala toda la pantalla, debe ser clicable, contiene transparencia que permite al usuario ver algunos de la capa de fondo

El problema al que me enfrento es con la capa de primer plano. Estoy asignando el método onClick() a la vista de imagen, pero el método se llama si golpean la parte de la imagen que es visible, así como la parte que contiene la transparencia. Sólo quiero que el método ImageView onClick() primer plano sea llamado cuando el usuario hace clic en una parte de esa vista de imagen que no es transparente.

Así es como se ve el escenario:

Introduzca aquí la descripción de la imagen

Las líneas diagonales representan la parte transparente de la imagen de primer plano. Si un usuario toca este espacio, quiero que acceda a la imagen de fondo en lugar de a la imagen de primer plano. Gracias por cualquier asistencia que puedas ofrecer.

Aquí está la solución que implementé (gracias a la respuesta a continuación):

 //ontouchlistener - gets X and Y from event private void setClick(View view) { view.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { int imageId = getImageId((int)event.getX(), (int)event.getY()); if (imageId >= 0) performActions(imageId); return false; } }); } //get the ID of the first imageview (starting from foreground, //working backwards) which contains a non-transparent pixel private int getImageId(int x, int y) { ViewGroup parent = (ViewGroup) findViewById(R.id.relative_layout); for (int a = parent.getChildCount()-1; a >= 0; a--) { if (parent.getChildAt(a) instanceof ImageView) if (!checkPixelTransparent((ImageView)parent.getChildAt(a), x, y)) return parent.getChildAt(a).getId(); } return -1; } //get bitmap from imageview, get pixel from x, y coord //check if pixel is transparent private boolean checkPixelTransparent(ImageView iv, int x, int y) { Bitmap bitmap = ((BitmapDrawable) iv.getDrawable()).getBitmap(); if (Color.alpha(bitmap.getPixel(x, y)) == 0) return true; else return false; } 

Esta muestra hace que el área transparente de ImageView no se pueda hacer clic.

ImageView:

 ImageView imgView= (ImageView) findViewById(R.id.color_blue); imgView.setDrawingCacheEnabled(true); imgView.setOnTouchListener(changeColorListener); 

OnTouchListener:

 private final OnTouchListener changeColorListener = new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Bitmap bmp = Bitmap.createBitmap(v.getDrawingCache()); int color = bmp.getPixel((int) event.getX(), (int) event.getY()); if (color == Color.TRANSPARENT) return false; else { //code to execute return true; } } }; 

Si su imagen de primer plano no es sólo una imagen recta sino una imagen compleja y realmente necesita que el toque sea preciso, puede utilizar

http://developer.android.com/reference/android/view/View.OnTouchListener.html

 foregroundImage.setOnTouchListener(new View.OnTouchListener(){...}); 

MotionEvent en la devolución de llamada contendrá qué tipo de acción sucedió (por ejemplo, Retoque) y la ubicación exacta.

Si conoce el tamaño exacto de la imagen de primer plano tal como se muestra, puede determinar qué píxel de la misma se ha hecho clic y, a continuación, comprobar si el alfa de ese píxel es 0. O puede que tenga que aplicar algo de escala si la imagen se ha escalado. Esto puede ser bastante complicado ya que dependiendo del tamaño de la pantalla y las proporciones de la imagen puede haber sido escalado / posicionado de manera diferente. Esto también depende de los diseños que utilizas.

Para la comprobación del valor de píxel, probablemente necesitará conservar en la memoria el objeto Bitmap que contiene los datos de imagen de primer plano.

Francamente, dudo que realmente necesitas toda esa precisión a menos que tu imagen de primer plano sea realmente de una forma muy irregular.

  • El cajón de navegación inhabilita la vista trasera cuando el cajón está abierto
  • Vistas superpuestas de Android y OnClick
  • Establecer determinado elemento en la vista de cuadrícula que no se puede hacer clic
  • Array @OnClick con identificadores opcionales (ButterKnife)
  • Diferencia entre onSingleTapConfirmed y onSingleTapUp
  • Vista no se puede resolver a un tipo
  • ¿Cómo agregar onclicklistener a la vista de texto generada dinámicamente?
  • Android Clic en el texto de la pantalla
  • efecto de clic de cuadrícula
  • Cómo desmarcar un elemento en gridview en segundo clic en android?
  • Android Detener la notificación de brindis por programación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.