Как предотвратить метод onClick на прозрачной части PNG-загруженного ImageView
В настоящее время я разрабатываю приложение для Android, которое отображает несколько изображений (какImageView's
) накладываются друг на друга. Вот как слои в настоящее время настроены:
Проблема, с которой я сталкиваюсь, связана со слоем переднего плана. Я назначаюonClick()
метод для imageview, но метод вызывается независимо от того, попадают ли они в ту часть изображения, которая видна, а также в ту часть, которая содержит прозрачность. Я хочу только передний план ImageViewonClick()
метод, который вызывается, когда пользователь щелкает непрозрачную часть изображения.
Вот как выглядит сценарий:
Диагональные линии представляют прозрачную часть изображения переднего плана. Если пользователь касается этого пространства, я хочу, чтобы оно получило доступ к фоновому изображению вместо изображения переднего плана. Спасибо за любую помощь, которую вы можете предоставить.
Вот решение, которое я реализовал (благодаря ответу ниже):
//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;
}