запрос касательно координат касания в ImageView в Android - PullRequest
1 голос
/ 29 ноября 2011

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

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

Проблема заключается в следующем:

  1. Я получаю странные (х, у) значения
  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;
        }
    });
    

1 Ответ

3 голосов
/ 29 ноября 2011

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

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

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

НТН

...