【发布时间】:2013-02-26 21:44:24
【问题描述】:
我目前正在开发一个 Android 应用程序,该应用程序显示多个堆叠在一起的图像(如 ImageView's)。以下是当前层的配置方式:
- 背景层:缩放整个屏幕,必须是可点击的
- 前景层:缩放整个屏幕,必须是可点击的, 包含透明度,允许用户看到一些 背景层
我面临的问题是前景层。我将onClick() 方法分配给imageview,但是无论它们是否击中可见的图像部分以及包含透明度的部分,都会调用该方法。我只希望在用户单击该图像视图的不透明部分时调用前景 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;
}
【问题讨论】:
-
尽量不要有透明的部分。如果可以的话,裁剪图像以去除透明部分
-
感谢您的评论,但有些前景图片非常复杂,无法裁剪
-
那么你必须查看图像的像素并与透明进行比较
-
@JeremiahGreco,你的问题解决了吗?我试过你的代码,但它不能正常工作。当您深入获取堆叠图像的颜色时,它每次都会返回不同的颜色。你能帮帮我吗?