Возвращаясь к этому через несколько месяцев, я теперь придерживался другого подхода: с помощью обработчика (как в примере 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 ()
// для перерисовки растрового изображения, перецентрированного там, где закончилась прокрутка
[ 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 View
// который выводит растровое изображение буфера на экран
// сдвинуто с учетом прокрутки
[MyView].invalidate();
}
// остаток класса MyGestureDetector
}