Sid*_*mit 3 android android-layout android-view
嗨,我正在创建tabla App,
例如

它不应该在圆形外响应,但ImageView是Rectangle,因此它正在响应
我相信你能理解这个问题
ImageView是矩形但它的图像是圆形的,但我想检测仅在圆形图像上的点击...
感谢您的支持,基于您通过以下方式提供的支持,它的工作非常完美
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)
似乎您将必须计算用户是否在圆形视图内触摸。这将必须通过重写我认为您已经编写的自定义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类中以对其进行扩展,并仅在需要时在图像内提供触摸事件。
如果图像一直延伸到边缘,则半径更容易确定。否则,将需要做一些额外的工作来找出实际区域的半径。
您可以将 附加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)- 触摸坐标,R是ImageView可绘制半径(在您的情况下,它将是宽度的一半ImageView)。
如果是,true您可以进一步传播触摸事件并返回false,否则返回true。