Получить сенсорное событие на объекте Paint в Android

Я рисую круг, используя 7 объектов рисования, как показано ниже, на холсте в моем приложении для Android. один и тот же объект рисования можно использовать более одного раза, чтобы нарисовать этот круг.

Теперь я хочу отображать имя цвета затронутого объекта краски, когда пользователь касается каждого цвета.

Как я могу это сделать ?

Обведите кружком объекты рисования


person Bishan    schedule 27.05.2013    source источник


Ответы (2)


Используйте на сенсорном событии для того же, например:

public class TouchImage extends ImageView {
    Paint paint = new Paint();
    Point point = new Point();

    public TouchImage(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint.setColor(Color.BLUE);
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(point.x, point.y, 10, paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            point.x = event.getX();
            point.y = event.getY();
            invalidate();
        }
        return true;
    }

    class Point {
        float x, y;
    }
}
person Gaurav Arora    schedule 27.05.2013
comment
я не использую canvas.drawCircle() для рисования круга. я использую canvas.drawArc() для этого. с комбинацией 24 дуг нарисуйте один круг. - person Bishan; 27.05.2013

У вас должны быть позиции для всех цветовых кругов. Внутри onTouchEvent() вы можете сравнить расстояние между каждым цветовым кругом и положением касания с радиусом цветных кругов.

Если расстояние меньше радиуса (и, возможно, больше минимального значения, поэтому касаться можно только цветов, а не пустой области внутри круга), вы можете получить угол и определить выбранный цвет таким образом.

 @Override
 public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        for (colorCircle c : allCircles) {
            float distance = sqrt ((event.getX() - c.getX())^2 +
                ((event.getY() - c.getY())^2);
            if (distance < c.getRadius()) {
                for (coloredPart cPart : c) {
                    if (event.getX() > (Math.cos(cPart.getMinAngle) * c.getRadius)
                        + c.getX() && 
                        event.getX() < (Math.cos(cPart.getMaxAngle) * c.getRadius)
                        + c.getX() && 
                        event.getY() > (Math.sin(cPart.getMinAngle) * c.getRadius)
                        + c.getY() && 
                        event.getY() < (Math.sin(cPart.getMaxAngle) * c.getRadius)
                        + c.getY() && ) {
                        // cPart was touched
                    }
                }
            }
        }
    }
    return true;
}
person Nazrim    schedule 27.05.2013