Как отслеживать нажатия по определенной часть моего CustomView?
Добрый день.
Вопрос такой - есть кастомная вью. Круг, поделенные на 4 части разных цветов. Хочу отслеживать нажатие по области, в которую входит один цвет, и исходя из этого уже делать дальнейшую обработку. Проблема в том, что я не понимаю, как это реализовать. Я могу забирать координаты по нажатию, но мне нужно записать куда то область, в которую входит например зеленый цвет, и обработать (если координаты входят в эту область, то...какие то действия).
Подскажите, как это реализовать?
Ответы (1 шт):
Начиная с 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 );
}
}
