Я использую onScroll метод GestureDetector. SimpleOnGestureListener для прокрутки большого битового массива на холсте. Когда прокрутка закончилась, я хочу перерисовать битовый массив в случае, если пользователь хочет прокрутить далее... от края битового массива, но я не вижу, как обнаружить, когда прокрутка закончилась (пользователь пошевелил пальцем с экрана).
e2.getAction () всегда, кажется, возвращает значение 2 так, чтобы не была никакая справка. e2.getPressure, кажется, возвращает довольно постоянные значения (приблизительно 0,25) до финала onScroll вызов, когда давление, кажется, падает приблизительно на 0,13. Я предполагаю, что мог обнаружить это сокращение давления, но это будет совсем не надежным.
Должен быть лучший путь: кто-либо может помочь?
Я не сделал это сам, но глядя на OnTouch (), вы всегда получаете последовательность 0 <2> 1, поэтому конец должен быть 1 для подъема пальца.
Вы должны взглянуть на 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); для признания его недействительным.
Я не знаю 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
Я не пробовал / не использовал это, но есть идея для подхода:
остановка / прерывание перерисовки холста при КАЖДОМ событии прокрутки, ожидание 1 с, а затем начало перерисовки холст на КАЖДОМ свитке.
это приведет к выполнению перерисовки только в конце прокрутки, поскольку только последняя прокрутка будет фактически непрерывной для завершения перерисовки.
надеюсь, что эта идея вам поможет :)
Выдержка из события onScroll из GestureListener API: текст ссылки
общедоступное абстрактное логическое значение onScroll ( MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) Поскольку: API Уровень 1
Возвращает * true, если событие используется, иначе false
Возможно как только событие было использовано, действие завершается, и пользователь убирает палец с экрана или, по крайней мере, завершает это действие onScroll
. Затем вы можете использовать это в операторе IF для поиска == true, а затем начать со следующим действием.
Возвращаясь к этому через несколько месяцев, я теперь придерживаюсь другого подхода: использую обработчик (как в примере 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
}