Мерцающая анимация в бесконечном ViewPager
Я столкнулся с действительно странным поведением в одном из моих приложений, и я действительно надеюсь, что вы, ребята, сможете дать мне несколько советов, как решить эту проблему.
Настроить:
Я разрабатываю вид презентационного приложения. Несколько изображений и / или видео должны отображаться повторно в виде бесконечного слайд-шоу, которое пока работает довольно хорошо. Я достиг этого, реализовав "бесконечный" ViewPager. Это в основном отслеживает пользовательскую позицию предмета и многократно отображает одинаковых фреймменов.
В дополнение к переходу слайдов по умолчанию, приложение должно обеспечивать переход с постепенным исчезновением (слайды не движутся, только постепенное исчезновение / постепенное исчезновение). Это, само по себе, тоже работает. Это в основном отключает Movenent страниц, добавляя инвертированный X-перевод, основанный на текущей позиции и ширине страниц.
Адаптер бесконечного Viewpager:
@Override
public Fragment getItem(int position) {
// Get the next position
// The ViewPager will increment the position continously
// We will keep track of that, and will deliver the same slides in an
// endless loop
if (position >= slideList.size() - 1) {
position = 0;
}
else {
position++;
}
Slide newSlide = mySlidesList.get(position);
Fragment frag = new Fragment();
frag = ImageSlideFragment.newInstance(newSlide);
return frag;
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
Пользовательская анимация затухания:
private void performFadeTransition(View page, float position){
//------------------------------------------------------------------------------------
// position | what does it mean
//------------------------------------------------------------------------------------
// 0 | view is positioned in the center and fully visible to the user.
// -1 | view is positioned in the left and not visible to the user.
// 1 | view is positioned in the right and not visible to the user.
// >-1 & <0 | view is being scrolled towards left and is partially visible.
// >0 & <1 | view is being scrolled towards right and is partially visible.
// ------------------------------------------------------------------------------------
// Get page width
int pageWidth = page.getWidth();
// Determine if the page is moving in or out of the Viewpager
boolean isMovingOut = position > -1 && position <= 0;
boolean isMovingIn = position >= 0 && position < 1;
// current fade out, next fades in.
// Change the pages visibility, the nearer it is to the center, the more visible
// it gets.
if (isMovingOut || isMovingIn) {
page.setAlpha(1.0F - Math.abs(position));
page.setTranslationX(pageWidth * -position);
}
// If the translation has finished, we have to reset the non visible pages
// on the far left and far right. Otherwise their invisibility would collide
// when an other transition type is used afterwards
else {
page.setAlpha(1.0F);
page.setTranslationX(0);
}
}
Проблема:
Теперь часть strage. Когда приложение какое-то время работает, скажем, пару сотен повторений, анимация затухания начинает давать сбои. Затухающие страницы больше не неподвижны, но начинают немного дрожать. Кажется, что вычисленный X-перевод не достаточно точен. Слайд-переходы, с другой стороны, все еще работают хорошо.
Возможная причина:
Я начал регистрировать, что именно происходит во время постепенного перехода. Поскольку заданное значение позиции показалось неверным, я начал регистрировать x-position страниц, что привело к следующему:
E/TPT: ------------------
E/TPT: position: 1.0
E/TPT: page.getX() before: 334080.0
E/TPT: ------------------
E/TPT: position: 1.0
E/TPT: page.getX() before: 336000.0
E/TPT: ------------------
E/TPT: position: 1.0
E/TPT: page.getX() before: 337920.0
E/TPT: ------------------
E/TPT: position: 1.0
E/TPT: page.getX() before: 339840.0
E/TPT: ------------------
E/TPT: position: 1.0
E/TPT: page.getX() before: 341760.0
Когда речь идет о том, что страницы с разрешением 1920px, кажется, что положение "новых" страниц по страницам X, кажется, увеличивается на 1920px каждый раз. Это означает, что через некоторое время x-позиции страниц будут в миллионах.
Поскольку x-перевод сделан относительно реальной позиции страниц, я предполагаю, что значение становится все более и более неточным, чем выше становится x-позиция.
Мой вопрос
Правильно ли мое предположение? Кто-нибудь знает, как я могу это исправить? Я действительно вне идей здесь...