Как вы можете продолжить прокрутку ScrollView при добавлении детей?

Контекст: у меня есть ScrollView, у которого могут быть дети, добавленные к его содержимому во время броска. Так как fling настроен с высотой содержимого ScrollView до того, как эти дети будут добавлены, если дети будут добавлены, тогда бросок останавливается (и фактически немного прокручивается назад из-за чрезмерного прокрутки), даже если он не достиг дна содержимое.

Я могу перезапустить fling с помощью #fling(int velocity), но я не могу понять, как получить текущую скорость движения или остановить текущий сброс. Любые идеи?

Ответ 1

Чтобы ответить на ваши вопросы из приглашения:

  • Нет API, чтобы получить текущую скорость ScrollView.
  • Вы можете остановить текущий переход, тщательно обработав события касания, как описано в предыдущем сообщении fooobar.com/questions/329680/....

Глядя на Исходный код ScrollView, он использует OverScroller для обработки событий перехода. Есть два способа приблизиться к этому:

  • Используйте отражение для доступа к частному полю mScroller в ScrollView. После того, как вы получили доступ к нему, вы можете получить текущую скорость через общедоступный API: public float getCurrVelocity(); Использование отражения никогда не является идеальным, поскольку вам нужно беспокоиться о том, что он нарушает версии Android, но простое изолированное использование может быть относительно эффективным.
  • Переопределите метод fling() в ScrollView и создайте экземпляр OverScroller для отслеживания прокрутки. Если все будет хорошо, ваш Overscoller всегда будет в том же состоянии, что и в ScrollView.

Что-то вроде этого:

@Override
public void fling(int velocityY)
{
    // Pass through fling to parent
    super.fling(velocityY);

    // Keep track of velocity using our own Overscoller instance
    mOurOverscroller = mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0,
    Math.max(0, bottom - height), 0, height/2);
}

Ответ 2

Я решил аналогичную проблему с методом @Override fling. Если вы переопределите метод fling в своем классе ScrollViewNoFling и не вызовите super.fling в этом методе, у вас будет не обработанный scrollView.

@Override
public void fling (int velocity)
{
    /*Scroll view is no longer going to handle scroll velocity.
     * super.fling(velocity);
    */
}