2014-10-14 3 views
0

Я использовал this Ответ от вопроса stackoverflow о включении пользовательского Scroller для слайд-анимации ViewPager, и он работает плавно. Он расширяет класс Scroller и использует отражение для доступа к полю mScroller.Вернитесь назад к по умолчанию ViewPager scroller

Теперь я хочу, чтобы некоторые условия были выполнены (onTouch() и таймер), чтобы вернуться к анимации прокрутки по умолчанию.

Пробовал клонировать mScroller поле:

 Interpolator decelerator = new DecelerateInterpolator(); 
    try { 
     mScroller = ViewPager.class.getDeclaredField("mScroller"); 
     cloneDefaultScroller = mScroller; 
     mScroller.setAccessible(true); 
     scroller = new CarouselScroller(pager.getContext(), decelerator); 
     mScroller.set(pager, scroller); 
    } catch (NoSuchFieldException e) { 
    } catch (IllegalArgumentException e) { 
    } catch (IllegalAccessException e) { 
    } 

включить его снова, как этот

где cloneDefaultScroller и mScroller являются:

Field mScroller; 
    Field cloneDefaultScroller; 

но то, что я получаю скроллер который перемещает только несколько пикселей, и я должен попробовать как 1 0 раз, чтобы иметь «нормальный» свиток (с одной страницы на другую).

Любой может помочь с этим? Спасибо

+0

Обновлен вопрос с большим количеством некоторого кода. – mt0s

ответ

1

Сначала попробуйте переименовать mScroller в mScrollerField, для вашего здравомыслия ... почему? потому что это просто описание поля из класса ViewPager, а не объекта за полем. Теперь очевидно, что нет необходимости в cloneDefaultScroller (вам не нужно другое описание поля из класса ViewPager, а скорее значение поля из экземпляра ViewPager)

поэтому код должен выглядеть (стареть и устанавливать новый):

Field mScrollerField; 
Scroller mOldScroller; 

Interpolator decelerator = new DecelerateInterpolator(); 
try { 
     mScrollerField= ViewPager.class.getDeclaredField("mScroller"); 
     mScrollerField.setAccessible(true); 
     mOldScroller = (Scroller)mScrollerField.get(pager); //getting old value 
     scroller = new CarouselScroller(pager.getContext(), decelerator); 
     mScrollerField.set(pager, scroller); 
} catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
     /*IMPORTANT at least pass the exception to logcat also for your 
     sanity (fx: in next version of compat library the field could be renamed 
     to mTheScroller and you could get NPE in restore code and then ask 
     stupid(without logcat) questions on SO why ...*/ 
} catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
} catch (IllegalAccessException e) { 
     e.printStackTrace(); 
} 

и восстановление:

mScrollerField.set(pager, mOldScroller); 
+0

потрясающий! Оно работает. Спасибо также за советы и комментарии :) – mt0s