Запрос относительно координат прикосновения на изображении в Android

StackOverflow https://stackoverflow.com/questions/8301913

Вопрос

У меня есть изображение в ImageView. Мне нужно знать точную (x, y) координату изображения, когда я касаюсь изображения. Я также хочу нарисовать круг на месте касания.

Ниже приведен код, который я использую. У меня есть изображение, и я прикрепляю к нему ontouchlistener.

Проблема в следующем:

  1. Я получаю странные (x, y) значения
  2. Новые круги нарисованы только 3 раза. После этого не нарисовано новые круги!

    ImageView touch=(ImageView) findViewById(R.id.image);
    touch.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN){
    
               //Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
               //Canvas can=new Canvas(bm);
               p.setColor(Color.RED);
               float fx=event.getX();
               float fy=event.getY();
               can.drawCircle(fx, fy, 20, p);                   
            }
            return true;
        }
    });
    
Это было полезно?

Решение

Проблема, скорее всего, вы не учитываете тот факт, что позиция MotionEvent корректируется, чтобы быть относительно содержащегося представления ( ImageView в этом случае) и похоже, что вы пытаетесь нарисовать их на другом Canvas который будет иметь другое координатное пространство. Если вам нужно, чтобы они были отдельными, я бы порекомендовал использовать MotionEvent.getRawX() а также MotionEvent.getRawY() так что значения сенсорных значений находятся в координатах экрана в целом.

Однако, если вы просто хотите нарисовать круги над изображением, лучшим решением будет подкласс ImageView Таким образом, вы можете обнаружить прикосновения в его onTouchEvent() метод напрямую (вместо слушателя) и выполняйте пользовательский рисунок в своем onDraw() Метод, гарантируя, что все находится в той же скорректированной плоскости координат.

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

Hth

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top