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.
- Android: ¿Cómo llamar a onTouch sólo después de un onLongClick?
- Usando un bucle para establecer los botones enclicklistener
- Eliminar un detector de onclick
- Cómo acceder al botón dentro de "incluir" el diseño
- Android ClickableSpan obtener texto onClick ()
Así es como se ve el escenario:
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; }
- Descartar Snackbar A la izquierda deslizar
- Android: Cómo propagar el evento de clic a los hijos de LinearLayout y cambiar su drawable
- Usando onClick en TextView con texto seleccionable - cómo evitar doble clic?
- Cómo implementar un oyente de clic largo y onclicklistener en listview único
- Método onClick no se llama en Android
- android imageButton método onClick no llamando
- Interceptación de clics desde subview en Android
- ¿Diferencia entre el evento OnClick () y OnClickListener?
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.