我有这个类似图形的圆圈,分为几个“部分”。我在画布上使用drawArc绘制这些。
canvas.drawArc(oval, startAngle, sweepAngle, true, fillPaint);
我想让这些弧变成可解决的,这样我就可以在用户点击它们时触发事件。所以我决定覆盖onTouchEvent,然后为ACTION_DOWN遍历我的所有部分,并检查触摸位置是否位于其中。
我试过回答类似问题的this code here,但我得到了奇怪的角度值(即右上象限的负值,其余部分的值在180-270之间)。
public boolean isInArea(float x, float y){
int deltaX = (int) (x - oval.centerX());
int deltaY = (int) (y - oval.centerY());
if (Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)) > mRectShape.width()/2) {
return false;
}
// offset for radiant, depending on quadrant
double offset = 0;
if (deltaX > 0 && deltaY < 0) {
// top right -> nothing to do
} else if (deltaX > 0 && deltaY > 0) {
// bottom right -> add 90 degrees
offset = Math.PI/2;
} else if (deltaX < 0 && deltaY > 0) {
// bottom left -> add 180 degrees
offset = Math.PI;
} else if (deltaX < 0 && deltaY < 0) {
// top left -> add 270 degrees
offset = Math.PI * 3/2;
}
//now calculate angle
double angle = Math.asin(deltaY / deltaX);
double total = angle + offset;
double totalDeg = total * 180 / Math.PI;
Log.d(LOG_TAG, "angle :" + totalDeg);
if(totalDeg > mStartAngle && totalDeg < mSweepAngle){
return true;
}
return false;
}
我也试过没有设置偏移n然后我得到顶部象限的负值,并且在底部象限中得到0到180之间的正值。
还尝试使用atan2:
angle = Math.atan2(deltaY, -deltaX);
我在这里缺少什么?