Ручной Scroll в Андроиде
Наверное, каждый задавался себе вопросом - как же необходимо скроллить, что бы ощущения были такие же как в приложениях Maps и Browser. И вот я хочу вам представить готовый рецепт, основанный на коде WebView.
Для этого будем использовать два класса - Scroller и VelocityTracker.
Первое, что нам нужно сделать - начать считать скорость и сохранять её. Приведу сразу код:
//Экземпляр VelocityTracker
//для подсчета скоростей
VelocityTracker mVelocityTracker;
//Переменные для сохранения координат, полученных при предыдущих
//вызовах onTouchEvent
int oldX = -1, oldY = -1;
//Переменные для смещения посчитанного
int dx = 0, dy = 0;
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN: {
//Получаем новый экземпляр VelocityTracker.obtain()
//Я не пробовал получать иначе, но в исходниках
//было именно так. Скорее всего можно
//просто вызывать VelocityTracker.clear();
mVelocityTracker = VelocityTracker.obtain();
oldX = (int) ev.getX();
oldY = (int) ev.getY();
return true;
}
case MotionEvent.ACTION_MOVE: {
//Необходимо вызывать этот код в ACTION_MOVE, ACTION_UP и
//возможно еще в ACTION_DOWN
mVelocityTracker.addMovement(ev);
int deltaX = (int) (oldX - ev.getX());
int deltaY = (int) (oldY - ev.getY());
oldX = (int) ev.getX();
oldY = (int) ev.getY();
//Делаем скролл на нужное смещение.
//Этот метод только для ACTION_MOVE.
mScroller.startScroll(dx, dy, -deltaX, -deltaY);
return true;
}
case MotionEvent.ACTION_UP: {
mVelocityTracker.addMovement(ev);
//Считаем скорость. 1000 пикселей в секунду -
//средняя ожидаемая скорость.
//В сырцах было именно 1000 и я
//не стал менять это значение
mVelocityTracker.computeCurrentVelocity(1000);
//Получаем скорость текущую
int vx = (int) mVelocityTracker.getXVelocity();
int vy = (int) mVelocityTracker.getYVelocity();
//Перед этим кодом был следующий коммент:
//Сделаем это более похожим на карты.
//Там скорость обрезается в два раза.
vx = vx * 3 / 4;
vy = vy * 3 / 4;
//Специальный метод для скролла, когда мы отпустили палец
mScroller.fling(dx, dy, vx, vy, 0, 1500, 0, 1500);
//Уничтожаем наш VelocityTracker
mVelocityTracker.recycle();
return true;
}
}
return true;
}
Думаю, что из исходника все ясно)
Теперь нам необходимо посчитать скролл и выводить что-то на экран. в моем случае - это просто картинка:
@Override
protected void onDraw(Canvas canvas) {
//Считаем скролл
mScroller.computeScrollOffset();
//Получаем координаты
dx = mScroller.getCurrX();
dy = mScroller.getCurrY();
//Выводим картинку
canvas.drawBitmap(bmp, dx, dy, new Paint());
//Повторяем цикл
invalidate();
}
В результате получили почти полноценный скролл:

Трекбек
Ссылка для трекбека:
http://stepa.name/archives/159/trackback
Комментарии
…
Интересно < /a…
Автор: Anatoliy | 01.12.2009 22:20
…
Норм …
Автор: Shadow | 11.01.2010 05:52
…
Спс …
Автор: Kolya | 19.01.2010 09:21
Агент по недвижимости/Риэлтор…
Агент по недвижимости/Риэлтор …
Автор: Стоян | 04.05.2010 18:37