Intereting Posts
Как подготовить макет, выдвижные папки для 7 ", 10" планшета для Android и для пейзажа и для портрета? Вызов метода удаления в пользовательском контенте Loader вызывает onLoadFinished до Activity onCreateOptionsMenu Правильно ли это использование фрагментов Android и NavigationDrawer? HTTP не работает в эмуляторе Android @IntDef Android поддерживает аннотацию с десериализацией Джексона Как сделать простые тесты junit ванили в андроиде? Получение ошибки при выполнении Android-всплывающее окно выше виртуальной клавиатуры Android selectableItemBackground не оказывает влияния на длительное нажатие Как управлять файлами cookie в мобильном браузере? Запуск простых тестов JUnit на Android Studio (IntelliJ) при использовании конфигурации на основе Gradle Обращайтесь с клавишей возврата, когда последний фрагмент Выполнение анимации push-фрагмента Сохранить данные LogCat в android Android-фрагмент – findViewById возвращает null

Добавление свойства touchListener к объекту пути

У меня есть холст, над которым я устанавливаю путь

Path path = new Path(); path.moveTo(1, 1); path.lineTo(90, 1); path.lineTo(90, 60); path.lineTo(1, 60); canvas.drawPath(path,p); 

Теперь я хочу внедрить сенсорный прослушиватель в этот объект пути.

Я внедрил функцию масштабирования в пользовательском ImageView и рисовал эти строки поверх холста в методе onDraw этого пользовательского ImageView. Поэтому я не могу это сделать, проверив координаты, где пользователь коснулся.

Я знаю, что объект path не является дочерним элементом класса View, и поэтому я не могу реализовать в нем touchListner. Но то, что мне точно нужно, это что-то вроде

 path.setOnTouchListener(myTouchListner); 

Кто-нибудь имеет представление о том, как его реализовать? Любая помощь приветствуется.

Solutions Collecting From Web of "Добавление свойства touchListener к объекту пути"

Нет такого понятия. Путь – это только структура данных, как вы ее используете (рисовать, клип …) не имеет к этому никакого отношения. А также события касания.

Вам просто нужно сделать математику с касанием координат. Это двумерное преобразование с использованием матрицы. Вы можете прочитать об этом в Википедии .

Сначала вы должны сопоставить точку касания с увеличенными / панорамированными координатами, посмотрите здесь , здесь и здесь .

Я не тестировал, но если у вас есть ImageView, этот метод должен делать:

 final float[] getPointerCoords(ImageView view, MotionEvent e) { final int index = e.getActionIndex(); final float[] coords = new float[] { e.getX(index), e.getY(index) }; Matrix matrix = new Matrix(); // invert compute the inverse transformation matrix view.getImageMatrix().invert(matrix); // this adjust the panning matrix.postTranslate(view.getScrollX(), view.getScrollY()); // this apply the inverse transformation to your touch points // which should give you the coordinates on your imageview matrix.mapPoints(coords); return coords; } 

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

Если вы сделаете эти преобразования на своем холсте, вы можете извлечь эту матрицу следующим образом:

 Matrix matrix = canvas.getMatrix() 

Другой маршрут – извлечь значения матрицы в массив и выполнить вычисление самостоятельно:

 // Get the values of the matrix // create this array in a field an reuse it for performances float[] values = new float[9]; matrix.getValues(values); 
  • values[2] и values[5] – это координаты x,y верхнего левого угла преобразованного элемента, независимо от коэффициента масштабирования
  • values[0] и values[4] являются коэффициентами масштабирования для ширины и высоты трансформированного элемента соответственно. Если вы увеличиваете один и тот же коэффициент, они должны быть одинаковыми.

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

 if (path.contains(coordX, coordY)) { // inside } else { // outside } 

Вы единственный, кто знает код, с которым вы работаете, и тем самым, как система координат пути преобразуется в вашем представлении и, следовательно, единственный, кто может знать, как правильно преобразовать его. Поэтому не думайте об этом ответе как о вставке кода. Я просто указал тебе в направлении. Может быть полезно распечатать некоторый журнал касания координаты / преобразования, чтобы отладить его во время разработки.

Удачи.

Можете ли вы onTouchEvent() через onTouchEvent() . Найдите координаты, которые вы коснулись, проверьте, совпадает ли координата с вашим путем., Если она вызывает вашу функцию.

Пожалуйста, уточните ниже. СПРАВОЧНАЯ ИНФОРМАЦИЯ