アプリの 1 つで非常に奇妙な動作に遭遇しました。これを解決する方法についてのヒントを教えていただければ幸いです。
セットアップ:
一種のプレゼンテーション アプリケーションを開発しています。複数の画像および/またはビデオは、これまでのところかなりうまく機能しているエンドレス スライドショーで繰り返し表示する必要があります。これは、「エンドレス」ViewPager を実装することで実現しました。これは基本的にカスタム アイテムの位置を追跡し、同じフレームを繰り返し表示します。
デフォルトのスライド トランジションに加えて、アプリはクロスフェード トランジションを提供する必要があります (スライドは移動せず、フェードイン/フェードアウトのみ)。これは、当然のことながら、機能しています。基本的に、現在の位置とページ幅に基づいて反転 X 変換を追加することにより、移動するページを無効にします。
エンドレス ビューページャーのアダプター:
@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);
}
}
問題:
今度はストレージ部分。アプリがしばらく実行されていると、数百回繰り返したとしましょう。フェード アニメーションに不具合が生じ始めます。色あせたページはもう動かないわけではありませんが、少し揺れ始めます。計算された x 変換は十分に正確ではないようです。一方、スライド トランジションは引き続き適切に機能します。
考えられる理由:
フェード遷移中に正確に何が起こっているかを記録し始めました。指定された位置の値が正しいように見えたので、ページの x 位置をログに記録し始めました。その結果、次のようになりました。
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 位置が高くなるほど、値がますます不正確になると想定しています。
私の質問
私の仮定は正しいですか?これを修正する方法を知っている人はいますか? 私はここで本当にアイデアがありません...