检测形状上的触摸事件

时间:2013-03-05 13:04:54

标签: android android-canvas

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

我在这里缺少什么?

0 个答案:

没有答案