1

ViewPager によく似たカスタム ページャーを実装しました。スクロール効果を出すには、canvas を使用します。新しいデバイス (Android 4.2) では意図したとおりに動作しますが、古いデバイス (Android 2.3) では機能しません。

onDrawは次のようになります

    Log.d(TAG, "onDraw()");
    if (mSwipe != null) {
        Log.d(TAG, "Swipe effect=" + (mSwipe.lastX - mSwipe.startX));
        canvas.translate(mSwipe.lastX - mSwipe.startX, 0);
    }

    Page current;

    current = getPage(mPosition);
    if (current != null) {
        if (mPosition != 0) {
            Log.d(TAG, "Offset effect=" + current.offset.left);
            canvas.translate(current.offset.left, 0);
        }

        Log.d(TAG, "Pager width=" + getWidth());

        Log.d(TAG, "Child width=" + current.view.getWidth());
        current.view.draw(canvas);
        // ...
        // Commented out. Used to draw pages around.
        // ...
    }

Android 4.2 の出力:

onDraw()
Pager width=1080
Child width=960

Android 2.3 の出力:

onDraw()
Pager width=480
Child width=420

私のテストページは、無地の背景といくつかのテキストを持つ単なる TextView です。

私が新しいデバイスで得たのは、ビューと近くのビューの描画がうまく機能したため、背景だけが占めるということです。

古いデバイスでは、フルスクリーンの赤一色 (現在のビューの色) にテキストが表示されます。子供を描くと、テキストは正しい位置に表示されますが、実際には背景が画面全体を占め、(それが意味することは) 現在のページを上書きします。

なぜそれが起こるのか誰にも分かりますか?私はそれについて何ができますか?

PS 子の幅は正しいです。これら 2 つのデバイスの仕様は大きく異なりますが、子ビューは親 (私のカスタム) ビューよりも少し小さくする必要があります。

スクリーンショット: アプリケーションのタイトルを無視します。フラグメントとは関係ありません。このテスト プロジェクトはたまたま Eclipse プロジェクトのリストにあり、そこにコードを実装しました。

隣人なし:

アンドロイド 2.3 アンドロイド 4.2

隣人と:

Android 2.3 (n) Android 4.2 (n)

4

1 に答える 1

0

カスタム ビューで xml をインフレートする方法を確認してください -inflateメソッドに親ビューを提供しますか? このメソッド (2 番目の引数) の親として設定nullした場合、親のレイアウト パラメータはカスタム ビューのレイアウトに使用されません。

于 2013-02-21T10:12:48.177 に答える