0

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 にアップロードしました。

ヘルプ/考え/ヒントは大歓迎です。

4

1 に答える 1

0

問題は、キャンバスの変換とはあまり関係のない WebView にあるのではないかと心配しています。WebView のスナップショットを取得して、スクロール中に WebView をスナップショットに置き換えることができます。

于 2014-01-17T14:26:47.207 に答える