我正在使用RelativeLayout,其中一个ImageView位于前面,另一个位于后台。我正在使用这个canvas方法制作前面的ImageView,半透明。
private Bitmap createTriangleImageTop(Bitmap bitmap) {
Bitmap bmp;
bmp = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Bitmap.Config.ARGB_8888);
BitmapShader shader = new BitmapShader(bitmap,
BitmapShader.TileMode.CLAMP,
BitmapShader.TileMode.CLAMP);
float radius = bitmap.getWidth() / 2f;
Canvas canvas = new Canvas(bmp);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setShader(shader);
Path path = new Path();
path.moveTo(0, 0);
path.lineTo(bitmap.getWidth()-5, 0);
path.lineTo(0, bitmap.getHeight()-5);
path.lineTo(0, 0);
path.close();
canvas.drawPath(path, paint);
return bmp;
}
它看起来像什么:http://imgur.com/i13BTb7
因此,当我在后台单击ImageView时,我从前面的ImageView获取OnclickListener。如果我单击前面的ImageView,我应该从前面获得OnClickListener。
我显然希望能够单击一个ImageView然后获取关联的OnClickListener,因此使用bringToFront()将BackgroundImageView放在前面并不能为我做好工作。
答案 0 :(得分:1)
问题的根源是Android View
是矩形的。即使顶部图像的一半是透明的,它仍然覆盖整个正方形。因此,当您“点击背景”时,您实际上是在点击前景的透明部分。
要获得所需的行为,请将前景点击侦听器更改为触摸侦听器,并仅在用户在不透明区域内单击时触发您的行为。
foreground.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getX() + event.getY() <= v.getWidth()) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
return true;
case MotionEvent.ACTION_UP:
// your code here
return true;
}
}
return false;
}
});
我正在使用event.getX() + event.getY() <= v.getWidth()
检查它是否在广场的左上角;如果你的前景层略有不同,你可能需要更复杂的计算。
如果用户在透明区域中单击,则返回false
,这表示前景未处理触摸。这允许触摸“穿过”前景并由背景处理。