我目前正在开发一个 Android 应用程序,该应用程序显示多个图像(如ImageView's
)堆叠在一起。以下是当前配置层的方式:
- 背景层:缩放整个屏幕,必须是可点击的
- 前景层:缩放整个屏幕,必须是可点击的,包含透明度,允许用户看到一些背景层
我面临的问题是前景层。我将该onClick()
方法分配给图像视图,但是无论它们是否击中可见的图像部分以及包含透明度的部分,都会调用该方法。onClick()
我只希望在用户单击该图像视图的不透明部分时调用前景 ImageView方法。
这是场景的样子:
对角线代表前景图像的透明部分。如果用户触摸这个空间,我希望它访问背景图像而不是前景图像。感谢您提供的任何帮助。
这是我实施的解决方案(感谢下面的回答):
//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;
}