我有这个类似图形的圆圈,分为几个“部分”。我在画布上使用 drawArc 绘制这些。
canvas.drawArc(oval, startAngle, sweepAngle, true, fillPaint);
我想让这些弧线可点击,以便在用户点击它们时触发事件。所以我决定覆盖 onTouchEvent,然后为 ACTION_DOWN 遍历我的所有部分并检查触摸位置是否在其中。
我在这里尝试了这个代码,它回答了一个类似的问题,但是我得到了奇怪的角度值(即右上象限的负值,其余的值在 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;
}
我也尝试不设置偏移量,然后我得到顶部象限的负值,底部象限的正值在 0 到 180 之间。
还尝试像这样使用 atan2:
angle = Math.atan2(deltaY, -deltaX);
我在这里想念什么?