Android: Как обнаружить, когда прокрутка закончилась

Я использую onScroll метод GestureDetector. SimpleOnGestureListener для прокрутки большого битового массива на холсте. Когда прокрутка закончилась, я хочу перерисовать битовый массив в случае, если пользователь хочет прокрутить далее... от края битового массива, но я не вижу, как обнаружить, когда прокрутка закончилась (пользователь пошевелил пальцем с экрана).

e2.getAction () всегда, кажется, возвращает значение 2 так, чтобы не была никакая справка. e2.getPressure, кажется, возвращает довольно постоянные значения (приблизительно 0,25) до финала onScroll вызов, когда давление, кажется, падает приблизительно на 0,13. Я предполагаю, что мог обнаружить это сокращение давления, но это будет совсем не надежным.

Должен быть лучший путь: кто-либо может помочь?

65
задан Kara 7 December 2013 в 20:34
поделиться

6 ответов

Я не сделал это сам, но глядя на OnTouch (), вы всегда получаете последовательность 0 <2> 1, поэтому конец должен быть 1 для подъема пальца.

0
ответ дан 24 November 2019 в 15:31
поделиться

Вы должны взглянуть на http://developer.android.com/reference/android/widget/Scroller.html. Особенно это может быть полезно (отсортировано по релевантности):

isFinished();
computeScrollOffset();
getFinalY(); getFinalX(); and getCurrY() getCurrX()
getDuration()

Это означает, что вы должны создать скроллер.

Если вы хотите использовать сенсорное управление, можно также использовать GestureDetector и определить собственную прокрутку холста. В следующем примере создается ScrollableImageView, и для его использования необходимо определить размеры изображения. Вы можете определить свой собственный диапазон прокрутки и после завершения прокрутки изображение будет перерисовано.

http://www.anddev.org/viewtopic.php?p=31487#31487

В зависимости от вашего кода вы должны считать его недействительным(int l, int t, int r, int b); для признания его недействительным.

4
ответ дан 24 November 2019 в 15:31
поделиться

Я не знаю Android, но, глядя на документацию, кажется, что Роб прав: Константа ACTION_UP Android Попробуйте проверить ACTION_UP из getAction ()?

Редактировать: Что показывает e1.getAction ()? Возвращает ли он когда-нибудь ACTION_UP? В документации говорится, что он содержит начальное событие отключения, поэтому, возможно, он также будет уведомлять, когда указатель поднят

Изменить: я могу придумать еще две вещи. Вы когда-нибудь возвращаете false? Это может помешать ACTION_UP

Единственное, что я бы попробовал - создать отдельное событие, например onDown, и установить флаг внутри onScroll, например isScrolling. Когда ACTION_UP передается onDown и установлен isScrolling, вы можете делать все, что хотите, и сбросить isScrolling на false. То есть, если предположить, что onDown вызывается вместе с onScroll, а getAction вернет ACTION_UP во время onDown

0
ответ дан 24 November 2019 в 15:31
поделиться

Я не пробовал / не использовал это, но есть идея для подхода:

остановка / прерывание перерисовки холста при КАЖДОМ событии прокрутки, ожидание 1 с, а затем начало перерисовки холст на КАЖДОМ свитке.

это приведет к выполнению перерисовки только в конце прокрутки, поскольку только последняя прокрутка будет фактически непрерывной для завершения перерисовки.

надеюсь, что эта идея вам поможет :)

0
ответ дан 24 November 2019 в 15:31
поделиться

Выдержка из события onScroll из GestureListener API: текст ссылки

общедоступное абстрактное логическое значение onScroll ( MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) Поскольку: API Уровень 1

Возвращает * true, если событие используется, иначе false

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

. Затем вы можете использовать это в операторе IF для поиска == true, а затем начать со следующим действием.

0
ответ дан 24 November 2019 в 15:31
поделиться

Возвращаясь к этому через несколько месяцев, я теперь придерживаюсь другого подхода: использую обработчик (как в примере Android Snake) для отправки сообщения в приложение каждые 125 миллисекунд, который предлагает это, чтобы проверить, была ли запущена прокрутка и прошло ли более 100 миллисекунд с момента последнего события прокрутки.

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

Соответствующий код находится в классе MyView:

public class MyView extends android.view.View {

...

private long timeCheckInterval = 125; // milliseconds
private long scrollEndInterval = 100;
public long latestScrollEventTime;
public boolean scrollInProgress = false;

public MyView(Context context) {
    super(context);
}

private timeCheckHandler mTimeCheckHandler = new timeCheckHandler();

class timeCheckHandler extends Handler{

        @Override
        public void handleMessage(Message msg) {
        long now = System.currentTimeMillis();
        if (scrollInProgress && (now>latestScrollEventTime+scrollEndInterval)) {
                    scrollInProgress = false;

// Прокрутка завершена, поэтому вставьте сюда код

//, который вызывает метод doDrawing ()

// для перерисовки растрового изображения с повторным центрированием, где прокрутка end

                    [ layout or view ].invalidate();
        }
        this.sleep(timeCheckInterval);
        }

        public void sleep(long delayMillis) {
            this.removeMessages(0);
            sendMessageDelayed(obtainMessage(0), delayMillis);
            }
    }
}

@Override protected void onDraw(Canvas canvas){
        super.onDraw(canvas);

// код для рисования большого растрового изображения буфера на холсте представления // позиционируется с учетом любой текущей прокрутки

}

public void doDrawing() {

// код для подробного (и отнимающего много времени) рисования // на большую битовую карту буфера

// следующая инструкция сбрасывает часы проверки времени // часы запускаются впервые, когда // основное действие вызывает этот метод при запуске приложения

        mTimeCheckHandler.sleep(timeCheckInterval);
}

// остальная часть класса MyView

}

и в классе MyGestureDetector

public class MyGestureDetector extends SimpleOnGestureListener {

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {

    [MyView].scrollInProgress = true;
        long now = System.currentTimeMillis();  
    [MyView].latestScrollEventTime =now;

    [MyView].scrollX += (int) distanceX;
    [MyView].scrollY += (int) distanceY;

// следующая инструкция вызывает вызов метода onDraw представления // который выводит растровое изображение буфера на экран // смещено с учетом прокрутки

    [MyView].invalidate();

}

// остальная часть класса MyGestureDetector

}

2
ответ дан 24 November 2019 в 15:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: