Attualmente sto sviluppando un'applicazione Android che visualizza più immagini (come ImageView's
) impilate l'una sull'altra. Ecco come gli strati sono attualmente configurati: stratoCome impedire il metodo onClick sulla parte trasparente di ImageView caricato con PNG
- Priorità: scale l'intero schermo, devono essere selezionabili
- livello di primo piano: scale l'intero schermo, deve essere cliccabile, contiene trasparenza che permette all'utente di vedere parte del livello di sfondo
Il problema che devo affrontare è con il livello in primo piano. Sto assegnando il metodo onClick()
alla vista di immagini, ma il metodo viene chiamato sia che colpiscano la parte dell'immagine che è visibile sia la parte che contiene la trasparenza. Voglio solo che venga chiamato il metodo ImageView onClick()
in primo piano quando l'utente fa clic su una porzione di tale visualizzazione che non è trasparente.
questo è ciò che lo scenario assomiglia:
Le linee diagonali rappresentano la porzione trasparente dell'immagine in primo piano. Se un utente tocca questo spazio, voglio che acceda all'immagine di sfondo invece dell'immagine in primo piano. Grazie per l'assistenza che puoi fornire.
Ecco la soluzione ho implementato (Grazie a risposta qui sotto):
//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;
}
cercare di non avere una parte trasparente. ritaglia l'immagine per rimuovere le parti trasparenti se puoi – njzk2
grazie per il tuo commento, ma alcune delle immagini in primo piano sono molto complesse e non possono essere ritagliate – sngreco
quindi devi guardare dentro i pixel dell'immagine e confrontare con trasparente – njzk2