如何防止加载PNG的ImageView的透明部分上的onClick方法

我目前正在开发一个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; } 

这一个示例使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; } } }; 

如果您的前景图像不仅仅是一个矩形而是一个复杂的图像,并且您确实需要触摸是像素精确的,您可以使用

http://developer.android.com/reference/android/view/View.OnTouchListener.html

 foregroundImage.setOnTouchListener(new View.OnTouchListener(){...}); 

回调中的MotionEvent将包含发生了什么样的动作(例如,Touch up)和确切的位置。

如果您知道前景图像显示的确切大小,则可以确定单击了哪个像素,然后检查该像素的alpha是否为0.或者如果图像缩放,您可能需要应用一些缩放。 这可能变得相当棘手,因为取决于屏幕尺寸和比例,图像可能已被不同地缩放/定位。 这还取决于您使用的布局。

为了检查像素值,您可能需要在内存中保留包含前景图像数据的Bitmap对象。

坦率地说,我怀疑你真的需要那么精确,除非你的前景图像真的是非常不规则的形状。