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