创建圆形的ImageView,因此单击将仅在圆形区域上工作

Sid*_*mit 3 android android-layout android-view

嗨,我正在创建tabla App,

例如

在此输入图像描述

它不应该在圆形外响应,但ImageView是Rectangle,因此它正在响应

我相信你能理解这个问题

ImageView是矩形但它的图像是圆形的,但我想检测仅在圆形图像上的点击...

Sid*_*mit 6

感谢您的支持,基于您通过以下方式提供的支持,它的工作非常完美

ImageView imgView = (ImageView) findViewById(R.id.imageView1);
        imgView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                //CIRCLE :      (x-a)^2 + (y-b)^2 = r^2 
                float centerX, centerY, touchX, touchY, radius;
                centerX = v.getWidth() / 2;
                centerY = v.getHeight() / 2;
                touchX = event.getX();
                touchY = event.getY();
                radius = centerX;
                System.out.println("centerX = "+centerX+", centerY = "+centerY);
                System.out.println("touchX = "+touchX+", touchY = "+touchY);
                System.out.println("radius = "+radius);
                if (Math.pow(touchX - centerX, 2)
                        + Math.pow(touchY - centerY, 2) < Math.pow(radius, 2)) {
                    System.out.println("Inside Circle");
                    return false;
                } else {
                    System.out.println("Outside Circle");
                    return true;
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)


Jay*_*der 5

似乎您将必须计算用户是否在圆形视图内触摸。这将必须通过重写我认为您已经编写的自定义ImageView类的touch事件来实现。

最初我以为绘制圆形区域就足够了,但事实并非如此。

伪代码:

public class CustomImageView implements ImageView
{
    private Point centerPoint;
    private float radius;

    @Override
    protected void onDraw(Canvas canvasF) 
    {
        Drawable drawable = getDrawable();
        if(centerPoint == null)
        {
            centerPoint = new Point (getWidth() / 2, getHeight() / 2);
            /* 
             * if radius extends to edges, but if circular code 
             * exists already then we should already know what the 
             * radius is at this point I would assume.
             */
            radius = getWidth() / 2;
        }

        /*
         * remaining draw code for manipulating a circle.
         */
    }

    private boolean isInsideCircle(Point touchedPoint)
    {
         int distance = (int) Math.round(Math.pow(touchedPoint.x - centerPoint.x, 2) + Math.pow(touchedPoint.y - centerPoint.y, 2));

         if(distance < Math.pow(radius, 2))
         {
             return true;
         }
         else
         {
             return false;
         }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event)
    {
        Point touchedPoint = new Point(Math.round(event.getX()),   Math.round(event.getY()));

        if(isInsideCircle(touchedPoint))
        {
            return super.onTouchEvent(event);
        }

        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我可能最终将其添加到ImageView类中以对其进行扩展,并仅在需要时在图像内提供触摸事件。

如果图像一直延伸到边缘,则半径更容易确定。否则,将需要做一些额外的工作来找出实际区域的半径。


aga*_*aga 2

您可以将 附加View.OnTouchListener到您的ImageView. 在该侦听器中只有一种名为 的方法OnTouchListener#onTouch (View v, MotionEvent event)。该event参数具有允许获取触摸坐标的方法。
当您获得相对于尺寸的触摸坐标时ImageView,您可以检查以下不等式是否为true(x - x0) ^ 2 + (y - y0) ^ 2 <= R ^ 2,其中(x,y)-ImageView中心坐标,(x0, y0)- 触摸坐标,RImageView可绘制半径(在您的情况下,它将是宽度的一半ImageView)。
如果是,true您可以进一步传播触摸事件并返回false,否则返回true