VerticalViewPagerのバージョンを拡張し、回転遷移アニメーション ( android.graphics.Cameraを使用) をビューページャーに追加しました。
getChildStaticTransformation で適用される重要な変換コードは次のとおりです。
@Override
protected boolean getChildStaticTransformation(View child, Transformation t) {
if (child.getHeight() == 0) {
return false;
}
int childPosition = child.getTop() / child.getHeight();
final boolean isFirstOrLast = childPosition == 0 || (childPosition == getAdapter().getCount() - 1);
if (childPosition < 0) {
return false;
}
if(isFirstOrLast && childOffsetVals[childPosition] == -1){
childOffsetVals[childPosition] = 0;
}
int offFactor = 2;
float dx = getWidth() / offFactor;
int dy = getHeight() / offFactor;
if (childOffsetVals[childPosition] > 0) {
float rotateX = (ROTATION_FACTOR * childOffsetVals[childPosition]);
float translateY = (TRANSLATION_FACTOR * childOffsetVals[childPosition]);
t.getMatrix().reset();
mCamera.save();
mCamera.rotateX(rotateX);
mCamera.translate(0, translateY, 0);
mCamera.getMatrix(t.getMatrix());
mCamera.restore();
t.getMatrix().preTranslate(-dx, -(dy));
t.getMatrix().postTranslate(dx, (dy));
} else if (childOffsetVals[childPosition] < 0 && childOffsetVals[childPosition] > -1) {
float rotateX = -(ROTATION_FACTOR * childOffsetVals[childPosition]);
float translateY = -(TRANSLATION_FACTOR * childOffsetVals[childPosition]);
t.getMatrix().reset();
mCamera.save();
mCamera.rotateX(rotateX);
mCamera.translate(0, translateY, 0);
mCamera.getMatrix(t.getMatrix());
mCamera.restore();
t.getMatrix().preTranslate(-dx, -(dy * offFactor));
t.getMatrix().postTranslate(dx, (dy * offFactor));
}
else {
t.getMatrix().reset();
mCamera.save();
mCamera.rotateX(0);
mCamera.getMatrix(t.getMatrix());
mCamera.restore();
t.getMatrix().preTranslate(-dx, -dy);
t.getMatrix().postTranslate(dx, dy);
}
if (getChildCount() == 1) {
this.invalidate();
} else {
child.invalidate();
}
return true;
}
この動作の最初の実装では、viewpager の各フラグメントには、ランダムに色付けされた背景を持つ単純な View が含まれていました。トランジション ローテーションが必要に応じて動作しているときに、単純な色付きのビューを (アプリに必要なように) Web ビューに置き換え、各フラグメントの Web ビューを Google ホームページにロードするだけでトランジションのテストを開始しました。これを行ったとき、ビューページャーの遷移中に奇妙な動作が見られるようになりました。ページが回転遷移を通過すると、webview のコンテンツが画面上で遷移している 2 つのページ間で分割され、各ページのレイアウトの残りの部分に背景が表示されるだけです。 Webビューの(私は青に設定しました)。
以下は、最初の実装で実行中の遷移のスクリーンショットです (色付きのビューのみを使用)。
ご覧のとおり、青いページは上にスクロールアウトし、緑のページはスクロールインしており、両方にトランジションの回転が適用されています。これは正しい、予想される動作です。
次のスクリーンショットは、色付きのビューを Google ホームページをロードする Web ビューに置き換えたときにアプリから取得したものです。前述したように、各ページの webview は、移行中にビューの完全なコンテンツを表示せず、代わりに背景に設定した青色を表示しています。
このサイトで多くの検索を行って、過去に同様の問題を抱えている人を見つけようとしましたが、役立つものは何も見つかりませんでした. なぜこれが起こっているのかについて少し困惑しており、これ以上時間を費やすことができないので、ここで助けていただければ幸いです。誰かがこの動作が webview で発生している理由を具体的に知っている場合、解決策/回避策を考え出すことができるので、それは役に立ちます。
いくつかの回避策を試しました。スクロール中にWebビューを一時停止してから再起動しようとした場所と、スクロール中にWebビューを、スクロールが開始されたときにWebビューのスナップショットを含むイメージビューに置き換えた場所です。これらの解決策はどちらもうまくいかないようでした。
ここで、ウェブビューのスクロールの問題をより明確に示すビデオを youtube にアップロードしました。
ヘルプ/考え/ヒントは大歓迎です。