Ручной 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…

Норм

Спс

Агент по недвижимости/Риэлтор…

Агент по недвижимости/Риэлтор

Post a comment