Подтвердить что ты не робот

Android: HorizontalScrollView smoothScroll время анимации

У меня есть ситуация, когда я использую горизонтальное представление прокрутки с изображениями и используя кнопки для сглаживания прокрутки к различным местоположениям изображений. Теперь все работает нормально, мне просто интересно, не знает ли кто-нибудь, чтобы замедлить метод гладкой прокрутки, т.е. Иметь более длительное время аннуляции? В настоящее время привязка происходит довольно быстро.

Возможно, с помощью переопределения smoothscroll я попытался найти это/примеры, но не повезло.

Итак, любые идеи?

Спасибо,

Si

4b9b3361

Ответ 1

Как насчет:

ObjectAnimator animator=ObjectAnimator.ofInt(yourHorizontalScrollView, "scrollX",targetXScroll );
animator.setDuration(800);
animator.start();

Ответ 2

Это один из способов, который хорошо работает для меня:

    new CountDownTimer(2000, 20) { 

        public void onTick(long millisUntilFinished) { 
            hv.scrollTo((int) (2000 - millisUntilFinished), 0); 
        } 

        public void onFinish() { 

        } 
     }.start();

Таким образом, горизонтальное представление прокрутки (hv) перемещается за две секунды с позиции 0 до 2000 или до конца представления, если оно меньше 2000 пикселей. Легко настраивается...

Ответ 3

Подкласс 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());
}

Ответ 4

Скроллер прокручивает автоматически и непрерывно. Это было сделано, чтобы показать экран кредитов, непрерывно прокручивая список изображений. Это может помочь вам или дать вам некоторые идеи.

https://github.com/blessenm/SlideshowDemo

Ответ 5

Используйте .smoothScrollToPositionFromTop вместо этого. Пример

listView.smoothScrollToPositionFromTop(scroll.pos(),0,scroll.delay());

где scroll - простая переменная из класса, который занимает текущее положение экрана .get() возвращает новую позицию .pos() и время плавной прокрутки .delay... и т.д.

Ответ 6

Это нормально?

Вы делаете анимацию для прокрутки

после анимации, прокрутите прокрутку до вашего положения

анимация легко контролирует время анимации

Ответ 7

Посмотрите http://developer.android.com/reference/android/widget/Scroller.html:

Продолжительность прокрутки может быть передана в конструкторе и задается максимальное время, в течение которого должна выполняться анимация прокрутки