Есть ли способ замедлить скорость прокрутки с помощью адаптера просмотра в Android?
Вы знаете, я смотрел этот код. Я не могу понять, в чем я ошибаюсь.
try{
Field mScroller = mPager.getClass().getDeclaredField("mScroller");
mScroller.setAccessible(true);
Scroller scroll = new Scroller(cxt);
Field scrollDuration = scroll.getClass().getDeclaredField("mDuration");
scrollDuration.setAccessible(true);
scrollDuration.set(scroll, 1000);
mScroller.set(mPager, scroll);
}catch (Exception e){
Toast.makeText(cxt, "something happened", Toast.LENGTH_LONG).show();
}
Ничего не меняет, но исключений нет?
child.setNestedScrollingEnabled(false);
работал у меняОтветы:
Я начал с кода HighFlyer, который действительно изменил поле mScroller (что является отличным началом), но не помог увеличить продолжительность прокрутки, потому что ViewPager явно передает длительность mScroller при запросе прокрутки.
Расширение ViewPager не сработало, поскольку важный метод (smoothScrollTo) нельзя переопределить.
В итоге я исправил это, расширив Scroller с помощью этого кода:
И используя это так:
Я в основном жестко задал продолжительность до 5 секунд и заставил свой ViewPager использовать его.
Надеюсь это поможет.
источник
scroller.setFixedDuration(5000);
выдает ошибку? Он говорит: «Метод setFixedDuration (int) не определен»Я хотел сделать сам и нашел решение (однако, используя отражение). Это похоже на принятое решение, но использует тот же интерполятор и изменяет продолжительность только в зависимости от фактора. Вам нужно использовать
ViewPagerCustomDuration
в своем XML вместоViewPager
, и тогда вы можете сделать это:ViewPagerCustomDuration.java
:ScrollerCustomDuration.java
:Надеюсь, это кому-то поможет!
источник
Я нашел лучшее решение, основанное на ответе @ df778899 и API Android ValueAnimator . Он отлично работает без отражений и очень гибкий. Также нет необходимости создавать собственный ViewPager и помещать его в пакет android.support.v4.view. Вот пример:
источник
startFakeDrag
иendFakeDrag
предназначены для того, чтобы делать больше, чем доступноViewPager
из коробки. Это отлично работает для меня, и это именно то, что я искалanimatePagerTransition(final boolean forward
метод? Вот что меня смущает. Вы вызываете это в одном изViewPager.OnPageChangeListener
методов интерфейса? Или еще где-нибудь?Как вы можете видеть в источниках ViewPager, длительность переброски контролируется объектом mScroller. В документации можно прочитать:
Итак, если вы хотите контролировать скорость, вы можете изменить объект mScroller через отражение.
Вы должны написать что-то вроде этого:
источник
Это не идеальное решение, вы не можете уменьшить скорость, потому что это
int
. Но для меня это достаточно медленно, и мне не нужно использовать отражение.Обратите внимание на пакет, в котором находится класс.
smoothScrollTo
имеет видимость пакета.источник
Notice the package where the class is
.package-local
fields
/methods
, если вы просто заставляете Android Studio думать, что используете тот же пакет? Я единственный, кто нюхаетsealing violation
?Методы fakeDrag в ViewPager, похоже, предлагают альтернативное решение.
Например, это будет страница с пункта 0 до 1:
(
count * count
Просто чтобы ускорить перетаскивание по мере его продвижения)источник
я использовал
Вот пример:
источник
На основе принятого решения я создал класс kotlin с расширением для просмотра пейджера. Наслаждайтесь! :)
источник
Вот ответ с использованием совершенно другого подхода. Кто-то может сказать, что в этом есть хакерское чувство; однако он не использует отражение, и я бы сказал, что он всегда будет работать.
Находим внутри следующий код
ViewPager.smoothScrollTo
:Он рассчитывает продолжительность на основе нескольких вещей. Видите что-нибудь, что мы можем контролировать?
mAdapter.getPageWidth
. Реализуем ViewPager.OnPageChangeListener в нашем адаптере . Мы собираемся обнаружить, когда ViewPager прокручивается, и дать фиктивное значение ширине . Если я хочу, чтобы длительность бытьk*100
, то я вернусь1.0/(k-1)
кgetPageWidth
. Ниже приведен код Kotlin для этой части адаптера, который превращает длительность в 400:Не забудьте добавить адаптер как OnPageChangedListener.
В моем конкретном случае можно с уверенностью предположить, что пользователь не может перемещаться между страницами свайпом. Если вам нужно поддерживать оседание после перетаскивания, вам нужно сделать немного больше в своих расчетах.
Одним из недостатков является то, что это зависит от жестко
100
заданного значения базовой продолжительности в ViewPager. Если это изменится, то при таком подходе изменится и ваша продолжительность.источник
Я хотел решить ту же проблему, что и все вы, и это мое решение для той же проблемы, но я думаю, что таким образом решение будет более гибким, поскольку вы можете изменить продолжительность, как вам нравится, а также изменить интерполяцию значений по своему желанию. для достижения различных визуальных эффектов. Мое решение перемещается со страницы «1» на страницу «2», поэтому только в увеличивающихся позициях, но может быть легко изменено для уменьшения позиций, выполняя «animProgress - lastFakeDrag» вместо «lastFakeDrag - animProgress». Считаю, что это наиболее гибкое решение для выполнения этой задачи.
источник