Плавная прокрутка с инерцией и сопротивлением кромки / snapback - PullRequest
4 голосов
/ 15 февраля 2011

Я реализовал базовую прокрутку с помощью сенсорного перетаскивания и мультитач-масштабирования для пользовательского просмотра.Это хорошо работает, но теперь я хотел бы добавить некоторые расширенные функции.

Например, в приложении Google Maps, когда вы перетаскиваете экран, после того, как вы перестанете перетаскивать его, он все равно будет немного двигаться(инерционность).А некоторые браузеры (например, IPad Safari) позволяют перетаскивать экран дальше, чем видимая область веб-сайта, но затем экран быстро возвращается к краю веб-сайта.

Теперь я хотел быреализовать нечто подобное, но для этого мне нужно изменить активную область экрана после события касания происходили через равные промежутки времени для выполнения анимации.Как я могу это сделать?

Ответы [ 2 ]

10 голосов
/ 15 февраля 2011

Используйте OnGestureListener .Чтобы обеспечить плавную прокрутку, создайте скроллер (в вашем пользовательском представлении).Когда слушатель жестов обнаружит событие броска, установите прокрутку вверх.Затем переопределите метод computeScroll () вашего пользовательского представления.

Проверьте этот пример, чтобы узнать, как его реализовать.

int lastX;
int lastY;
Scroller scroller;    
@Override
public void computeScroll() {
  if (scroller.computeScrollOffset()) {
    if (!scrolledLastFrame) {
      lastX = scroller.getStartX();
      lastY = scroller.getStartY();
    }

    int dx = scroller.getCurrX() - lastX;
    int dy = scroller.getCurrY() - lastY;

    lastX = scroller.getCurrX();
    lastY = scroller.getCurrY();

    doScroll(dx, dy);
    scrolledLastFrame = true;
  } else {
    scrolledLastFrame = false;
  }

}    

public void doFling(int startX, int startY, int velocityX, int velocityY,
    int minX, int maxX, int minY, int maxY) {
  scroller.fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY);
  invalidate();
}

public void doScroll(int dx, int dy) {
  currentX+=dx;
  currentY+=dy;

  invalidate();
}

private class ProgramGestureListener extends SimpleOnGestureListener {

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

      doScroll(distanceX, distanceY);
      return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
      int max_left = getMaxHorizontalScroll();
      int max_top = getMaxVerticalScroll();
      int min_left = getMinHorizontalScroll();
      int min_top = getMinVerticalScroll();

      int startX = getCurrentHorizontalScroll();
      int startY = getCurrentVerticalScroll();

      doFling(startX, startY, (int) -velocityX, (int) -velocityY,
          min_left, max_left, min_top, max_top);

      return true;
    }
  }
1 голос
/ 15 февраля 2011

Используйте класс Scroller , я опубликовал пример использования здесь .

Если вы используете API 9, вы можете использовать OverScroller Я думаю.

...