Alpha-Überblendung in OnPageChangeListener

Es gibt viele Fragen zum Überblenden in Android, aber alle enthalten Animationen. Meine Frage betrifft das Überblenden mit dem OnPageChangeListener eines ViewPagers.

Ich habe einen ViewPager, der eine unbegrenzte Anzahl von Ansichten haben könnte, aber in der Praxis ungefähr 6 oder 7 Ansichten verwendet. Da ist nicht viel los.

Jede Ansicht im ViewPager verfügt über eine Hintergrund-Bitmap, die korrigiert und mit dem Hintergrund der nächsten (oder vorherigen) Ansicht überblendet werden sollte, anstatt mit dem Rest der Ansicht zu scrollen.

Um dies zu erreichen, entkoppelte ich die Hintergründe und fügte sie einer ArrayList hinzu und ordnete sie später ImageViews zu. Da ich aber nicht riskieren möchte, dass meine Aktivität mit zahlreichen ImageViews endet, habe ich mir folgende Struktur überlegt:

<FrameLayout 
    android:id="@+id/backgroundContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/bottomImage"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:scaleType="center" />

    <ImageView
        android:id="@+id/middleImage"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:scaleType="center" />

    <ImageView
        android:id="@+id/topImage"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:scaleType="center" />

</FrameLayout>

Dann einOnPageChangeListener wird dem ViewPager zugewiesen, um die Hintergründe den ImageViews zuzuweisen.

@Override
public void onPageSelected(int position) {
    MyLog.i(TAG, "PAGE SELECTED: " + position);

    if(position == 0) {
        _bottomBackground.setImageBitmap(null);
        _topBackground.setImageBitmap(_backgroundStack.get(position+1));
    } else if (position == NUM_ITEMS-1) {
        _bottomBackground.setImageBitmap(_backgroundStack.get(position-1));
        _topBackground.setImageBitmap(null);
    } else {
        _bottomBackground.setImageBitmap(_backgroundStack.get(position-1));
        _topBackground.setImageBitmap(_backgroundStack.get(position+1));
    }

    _middleBackground.setImageBitmap(_backgroundStack.get(position));            

    // Make the top front background transparent 
    _topBackground.setAlpha(0f);
    _currentBackgroundPosition = position;
}

Das funktioniert gut, wenn ich nur die Hintergründe hätte tauschen wollen. Ich möchte, dass die Hintergründe ineinander übergehen, während der Benutzer den ViewPager wischt. Ich habe die Überblendung für eine Vorwärtsrolle aktiviert, aber ich verstehe nicht, warum die Überblendung für die Rückwärtsrolle irgendwie kein gutes Ergebnis liefert. Während eines Rückwärtslaufs sollte der mittlere Hintergrund in den unteren Hintergrund übergehen.

Ich fürchte, ich vermisse etwas. Ich ändere nie das Alpha des unteren Hintergrunds, aber die Log-Ergebnisse zeigen immer den exakt gleichen Wert fürgetAlpha() wie für den mittleren Hintergrund.

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    if(_currentBackgroundPosition == position) {
        // scroll forward
        _topBackground.setAlpha(positionOffset)
    } else {
        //scroll backward
        _middleBackground.setAlpha(positionOffset);               
    }

    MyLog.i(TAG, "Bottom BackgroundAlpha: " + _bottomBackground.getAlpha());
    MyLog.i(TAG, "Middle BackgroundAlpha: " + _middleBackground.getAlpha());
    MyLog.i(TAG, "Top BackgroundAlpha: " + _topBackground.getAlpha());
}

Und warte! Es gibt noch eine Sache, die ich wirklich nicht lösen kann. Obwohl der Vorwärts-Scroll-Fade funktioniert. Es gibt ein super kurzes Flackern im Hintergrund. Ich nehme an, das passiert, weil ich das so eingerichtet habeonPageSelected Methode.

Gibt es eine andere Möglichkeit, wie ich dieses Verhalten erstellen / beheben kann?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage