Как отслеживать нажатия по определенной часть моего CustomView?

введите сюда описание изображения

Добрый день.

Вопрос такой - есть кастомная вью. Круг, поделенные на 4 части разных цветов. Хочу отслеживать нажатие по области, в которую входит один цвет, и исходя из этого уже делать дальнейшую обработку. Проблема в том, что я не понимаю, как это реализовать. Я могу забирать координаты по нажатию, но мне нужно записать куда то область, в которую входит например зеленый цвет, и обработать (если координаты входят в эту область, то...какие то действия).

Подскажите, как это реализовать?


Ответы (1 шт):

Автор решения: Style-7

Начиная с API 19 для детектирования нажатия на любые сложные формы, в том числе и сектор круга, можно использовать такой подход. Создаем Path области, им же, как правило, и рисуем. При касании создаем второй тестовый Path - квадрат в точке касания размером в один пиксель. Методом op делаем операцию INTERSECT оставляя общую область, далее если проверочный Path не пустой - значит мы нажали на нужной области. Пример который протестировал. Обратите внимание как создается сектор круга, в инете я пример не нашел.

public class ViewPath extends View{
    Path path;
    Paint paint;
    public ViewPath( Context context ){
        super( context );
        path = new Path();
        RectF rect = new RectF(200,100,200+500,100+500);
        path.moveTo( rect.centerX(), rect.centerY() );
        path.arcTo( rect, 0, 90, false );
        paint = new Paint( Paint.ANTI_ALIAS_FLAG );
        paint.setColor( 0xfff00000);
    }

    @Override
    protected void onDraw( Canvas canvas ){
        super.onDraw( canvas );
        canvas.drawPath( path, paint );
    }

    @Override
    public boolean onTouchEvent( MotionEvent event ){
        if( event.getAction() == MotionEvent.ACTION_DOWN ){
            Path path_test = new Path();
            float x = event.getX();
            float y = event.getY();
            path_test.addRect( x, y, x+1, y+1, Path.Direction.CW );
            path_test.op( path, Path.Op.INTERSECT );
            if( !path_test.isEmpty() ){
                Toast.makeText( this.getContext(), "OK!", Toast.LENGTH_SHORT ).show();
            }
        }
        return super.onTouchEvent( event );
    }
}
→ Ссылка