Android перетащите изображение вдоль боковой дорожки

#android #kotlin

Вопрос:

Итак, у меня есть путь, и я хочу перетащить свое представление по этому пути вертикально. это мой onTouchListener код для представления:

 val point = FloatArray(2)
val pathMeasure = PathMeasure(path, true)

 tooltipView.setOnTouchListener(object :View.OnTouchListener{
            override fun onTouch(v: View?, event: MotionEvent?): Boolean {
                onDataPointTouchListener()
                if (event?.action == MotionEvent.ACTION_MOVE){
                    v?.performClick()
                    pathMeasure.getPosTan(event.x, point, null) // This is where I get path point
                    v?.x = point[0] - tooltipWith / 2
                    v?.y = point[1] - tooltipHeight
                }else if (event?.action == MotionEvent.ACTION_UP){
                    tooltipView.animate().translationX(previousX - tooltipWith / 2)
                    tooltipView.animate().translationY(previousY - tooltipHeight)
                    layoutDate.visible()
                }
                return true
            }
        })
 

Может кто-нибудь, пожалуйста, помочь мне. Мой путь — изогнутая линия. Я хочу иметь возможность перетащить представление в эту строку.Так же, как панель поиска:

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

Ответ №1:

То, что вы пытаетесь сделать, несколько сложно и зависит от того, какие короткие пути вы готовы пойти.

Самое простое, что я могу придумать, это: используйте PathMeasure, чтобы пройти по пути и решить, к какой точке пути ближе всего ваш палец (петля по всему пути по сравнению с event.x/y ). Переместите позицию в эту точку. Это не так гладко, как на панели поиска. Который анимируется на ваш палец.

Комментарии:

1. Спасибо. Я решаю проблему другими способами. но ваше описание совершенно верно.

Ответ №2:

Гораздо проще использовать MotionLayout (библиотека компоновки ограничений 2) — вам нужно только установить XML-файл с 2 наборами ограничений, а библиотека обрабатывает остальные.

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

Рекомендации:

  1. Управляйте движением и анимацией виджетов с помощью MotionLayout
  2. Примеры перемещения

Комментарии:

1. Спасибо. но я использую пользовательский макет. Это диаграмма, которую я хочу, чтобы пользователь мог перетаскивать подсказку с помощью касания.

2. О, я понимаю, извини. Вы хотите, чтобы анимация пути начиналась, как только пользователь отпустит перетаскивание?

3. Нет. Я обновил вопрос. пожалуйста, взгляните

4. Для меня это звучит как вариант использования макета движения, если только у вас нет xml-файла макета

5. ДА. У меня нет layout.xml.