Движение Android после свайпа

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

Я хочу добиться эффекта "движущегося объекта". Итак, если пользователь коснулся экрана и переместил палец на 20 единиц вправо за 2 секунды, я не хочу, чтобы отдельные движения на 20 единиц были правильными, но я хочу, чтобы это движение продолжалось, замедляясь. Итак, в следующие 2 секунды я хотел бы получить еще одно движение, скажем, на 10 единиц.

Пользователь также должен иметь возможность остановить это движение, т.е. снова коснувшись моего компонента.

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

С чего начать? Что-то делается или мне самому все писать?

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

Если это правильное решение, как создать такой таймер для приложения Android?


person Ari    schedule 04.07.2014    source источник


Ответы (1)


Я могу дать более конкретный ответ, если увижу часть вашего кода; в частности, как выглядит «перемещение на 20 единиц» в коде. Тем не менее, вы можете использовать GestureDetector для перехвата событий прокрутки и выбрасывания.

По вашему мнению, вы хотите, чтобы его можно было «перелистывать», добавьте следующий код:

if (mGestureListener == null) {
    mGestureListener = new SimpleOnGestureListener();
}
mGestureDetector = new GestureDetector(mContext, mGestureListener);
mTouchListener = new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        return mGestureDetector.onTouchEvent(event);
    }
};
this.setOnTouchListener(mTouchListener);

Затем в своей деятельности создайте класс, который расширяет SimpleOnGestureListener. В этом классе переопределите методы onFling и onScroll — опять же, я не могу сказать вам, что туда вставить, не видя вашего кода. Но эти обратные вызовы получают информацию, которая вам понадобится для создания ваших методов: MotionEvent, который запустил жест, MotionEvent, который завершил его, и скорость x & y для бросания или расстояние x & y для прокрутки.

Если вы хотите, чтобы он переместился на определенное расстояние, а затем замедлился, вы можете добавить ValueAnimator к любому свойству, вызывающему движение, и присвоить ему DecelerateInterpolator.

Наконец, когда вы настраиваете свою активность, передайте вашему представлению новый экземпляр класса прослушивателя жестов и используйте его для установки mGestureListener в вашем представлении с возможностью пролистывания.

person EricaCooksey    schedule 04.07.2014