用于剪切ImageViews的Canvas方法

时间:2017-08-29 21:36:15

标签: android xml

我正在使用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放在前面并不能为我做好工作。

1 个答案:

答案 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,这表示前景未处理触摸。这允许触摸“穿过”前景并由背景处理。