Мерцающая анимация в бесконечном 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-позиция.

Мой вопрос
Правильно ли мое предположение? Кто-нибудь знает, как я могу это исправить? Я действительно вне идей здесь...

0 ответов

Другие вопросы по тегам