Ответ 1
Как насчет:
ObjectAnimator animator=ObjectAnimator.ofInt(yourHorizontalScrollView, "scrollX",targetXScroll );
animator.setDuration(800);
animator.start();
У меня есть ситуация, когда я использую горизонтальное представление прокрутки с изображениями и используя кнопки для сглаживания прокрутки к различным местоположениям изображений. Теперь все работает нормально, мне просто интересно, не знает ли кто-нибудь, чтобы замедлить метод гладкой прокрутки, т.е. Иметь более длительное время аннуляции? В настоящее время привязка происходит довольно быстро.
Возможно, с помощью переопределения smoothscroll я попытался найти это/примеры, но не повезло.
Итак, любые идеи?
Спасибо,
Si
Как насчет:
ObjectAnimator animator=ObjectAnimator.ofInt(yourHorizontalScrollView, "scrollX",targetXScroll );
animator.setDuration(800);
animator.start();
Это один из способов, который хорошо работает для меня:
new CountDownTimer(2000, 20) {
public void onTick(long millisUntilFinished) {
hv.scrollTo((int) (2000 - millisUntilFinished), 0);
}
public void onFinish() {
}
}.start();
Таким образом, горизонтальное представление прокрутки (hv) перемещается за две секунды с позиции 0 до 2000 или до конца представления, если оно меньше 2000 пикселей. Легко настраивается...
Подкласс HorizontalScrollView использует отражение, чтобы получить доступ к частному полю mScroller
в HorizontalScrollView. Конечно, это сломается, если базовый класс изменит имя поля, оно по умолчанию возвращается к первоначальной реализации прокрутки.
Вызов myScroller.startScroll(scrollX, getScrollY(), dx, 0, 500);
изменяет скорость прокрутки.
private OverScroller myScroller;
private void init()
{
try
{
Class parent = this.getClass();
do
{
parent = parent.getSuperclass();
} while (!parent.getName().equals("android.widget.HorizontalScrollView"));
Log.i("Scroller", "class: " + parent.getName());
Field field = parent.getDeclaredField("mScroller");
field.setAccessible(true);
myScroller = (OverScroller) field.get(this);
} catch (NoSuchFieldException e)
{
e.printStackTrace();
} catch (IllegalArgumentException e)
{
e.printStackTrace();
} catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
public void customSmoothScrollBy(int dx, int dy)
{
if (myScroller == null)
{
smoothScrollBy(dx, dy);
return;
}
if (getChildCount() == 0)
return;
final int width = getWidth() - getPaddingRight() - getPaddingLeft();
final int right = getChildAt(0).getWidth();
final int maxX = Math.max(0, right - width);
final int scrollX = getScrollX();
dx = Math.max(0, Math.min(scrollX + dx, maxX)) - scrollX;
myScroller.startScroll(scrollX, getScrollY(), dx, 0, 500);
invalidate();
}
public void customSmoothScrollTo(int x, int y)
{
customSmoothScrollBy(x - getScrollX(), y - getScrollY());
}
Скроллер прокручивает автоматически и непрерывно. Это было сделано, чтобы показать экран кредитов, непрерывно прокручивая список изображений. Это может помочь вам или дать вам некоторые идеи.
Используйте .smoothScrollToPositionFromTop
вместо этого. Пример
listView.smoothScrollToPositionFromTop(scroll.pos(),0,scroll.delay());
где scroll
- простая переменная из класса, который занимает текущее положение экрана .get()
возвращает новую позицию .pos()
и время плавной прокрутки .delay
... и т.д.
Это нормально?
Вы делаете анимацию для прокрутки
после анимации, прокрутите прокрутку до вашего положения
анимация легко контролирует время анимации
Посмотрите http://developer.android.com/reference/android/widget/Scroller.html:
Продолжительность прокрутки может быть передана в конструкторе и задается максимальное время, в течение которого должна выполняться анимация прокрутки