我目前正在开发一个 Android 应用程序,它显示多个图像(如 ImageView 的
)彼此堆叠。以下是图层当前的配置方式:
- 背景层:缩放整个屏幕,必须可点击
- 前景层:缩放整个屏幕,必须是可点击的, 包含透明度,允许用户看到一些 背景层
我面临的问题是前景层。我正在将 onClick()
方法分配给 imageview,但是无论它们是否击中了图像的可见部分以及包含透明度的部分,都会调用该方法。我只希望在用户单击该 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;
}
最佳答案
This one sample使ImageView的透明区域不可点击。
ImageView :
ImageView imgView= (ImageView) findViewById(R.id.color_blue);
imgView.setDrawingCacheEnabled(true);
imgView.setOnTouchListener(changeColorListener);
OnTouchListener:
private final OnTouchListener changeColorListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Bitmap bmp = Bitmap.createBitmap(v.getDrawingCache());
int color = bmp.getPixel((int) event.getX(), (int) event.getY());
if (color == Color.TRANSPARENT)
return false;
else {
//code to execute
return true;
}
}
};
关于android - 如何在加载 PNG 的 ImageView 的透明部分防止 onClick 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15343266/