0

我有这个类似图形的圆圈,分为几个“部分”。我在画布上使用 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);

我在这里想念什么?

4

0 回答 0