Uranium Developers
Uranium Developers

Reputation: 132

Detect touch outside of View

I have a custom View and I wonder, is there any chace that I could detect if something outside of my View is clicked. It MUST be in the View class, or else it can not work as I intended it to!

Full file: https://github.com/Nicba1010/AndroidLibrary/blob/master/src/com/nicba1010/utils/views/PieChartView.java

OnTouchEvent(so you know I did something)

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
        selected = null;
        invalidate();
        return true;
    }
    double deltaX = event.getX() - rect.width() / 2 - rect.left;
    double deltaY = -(event.getY() - rect.height() / 2 - rect.top);
    double fromMid = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
    boolean inCircle = fromMid < (rectSelect.bottom / 2);
    if (inCircle) {
        double angleInDegrees = getPositionOnCircumference(deltaX, deltaY);
        float percentage = (float) (angleInDegrees / 360f);
        float totalPerc = 0;
        int index = -1, i = 0;
        for (PieChartSlice e : slices) {
            if (percentage > totalPerc) {
                index = i;
            } else if (percentage < totalPerc) {
                break;
            }
            totalPerc += e.getPercentage();
            i++;
        }
        if (index == -1) {
            Toast.makeText(getContext(), "ERROR", Toast.LENGTH_LONG).show();
        } else {
            final PieChartSlice tmp = slices.get(index);
            addScaleTask(rect, 500, 0.9f, new Runnable() {
                @Override
                public void run() {
                    selected = tmp;
                }
            });
            selected = slices.get(index);
            invalidate();
            Toast.makeText(getContext(), selected.getName(),
                    Toast.LENGTH_SHORT).show();
            onSliceSelectedListener.onSliceSelected(this, selected);
        }
    } else {
        if (selected != null) {
            addScaleTask(rect, 500, 1f, new Runnable() {
                @Override
                public void run() {
                    selected = null;
                }
            });
            invalidate();
        }
    }
    return super.onTouchEvent(event);
}

Upvotes: 1

Views: 4467

Answers (1)

Blackbelt
Blackbelt

Reputation: 157487

View has the getHitRect(Rect) method. You can use to retrieve it hit rect of this view and you can use this rect to check it the MotionEvent it is inside it. For instance

Rect rect = new Rect();
getHitRect(rect); 
if (rect.contains((int) event.getX(), (int) event.getY()) {

}

Upvotes: 3

Related Questions