1

私は会社の電子書籍読書アプリに取り組んでいます。私が提供するカスタムビューへの画面の動的リフローレイアウトを行うライブラリを使用します。

ユーザーが指でスワイプすることで、ある画面から次の画面に移動できるディスプレイが必要です。カスタムアダプターに支えられた独自の android.widget.Gallery サブクラスを使用しています。アダプターの getView() は、ライブラリーと対話し、要求された各ページのビューを生成する役割を果たします。

私の問題は、ギャラリーがビューの総数を知り、ビュー配列内の現在の位置のインデックスを持つことを期待していることですが、使用するライブラリではそれを知ることができません。動的リフローを行うため、ブックを構成する「画面」の総数は、デバイスの画面サイズ、現在のフォント サイズ、画面の向きなどによって異なります。事前に知る方法はありません。本の中の任意の場所にジャンプすることもできます。その場合、最初からいくつの「画面」があるかを知る方法はありません (最初に戻って、一度に同じ場所にページを進める以外に)、位置インデックスを取得する方法はありません。ギャラリー ビューに移動します。

私の現在の解決策は、アダプターの getView() 呼び出しでギャラリーの「終了」を特別な条件として処理することです。ギャラリーの開始に達したが、さらに多くのページが利用可能であることがわかっている場合、ギャラリーに現在の位置を変更させます。PageAdapter.getView() の例を次に示します。

public View getView(int position, View convertView, ViewGroup parent)
{
    ...
    if( 0 == position ) {
        // The adapter thinks we're at screen 0; verify that we really are
        int i = 0;

        // previousScreen() returns true as long as it could move
        // to another screen; after this loop, i will equal the
        // number of additional screens before our current position
        while( m_book.previousScreen() ) {
            i++;
        }

        PageFlipper pf = (PageFlipper) parent;

        // Remember the last REAL position we dealt with.
        // The +1 to mActualPosition is a hack--for some reason,
        // PageFlipper.leftResync() needs it to work correctly.
        m_lastRequestedPosition = i;
        pf.mActualPosition = i + 1;
        pf.mNeedsLeftResync = true;

        // Do a fixup so we're on the right screen
        while( i-- > 0 ) {
            m_book.nextScreen();
        }
    }
    ...
    m_view = new PageView(m_book);
    return m_view;
}

Gallery サブクラスでの使用方法は次のとおりです。

public class PageFlipper extends Gallery {
    ...
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        // Triggers a call to PageAdapter.getView()
        super.onScroll(e1, e2, distanceX, distanceY);
        // Adapter getView() may have marked us out of sync
        this.checkLeftResync();
        return true;
    }
    ...
    private void checkLeftResync() {
        if( mNeedsLeftResync ) {
            setSelection(mActualPosition, false);
            mActualPosition = 0;
            mNeedsLeftResync = false;
        }
    }
}

しかし、私の解決策は信頼性が低く、直感的に間違っていると感じています。私が本当に欲しいのは、Gallery ウィジェットのように見えて感じるものですが、位置を追跡することはありません。代わりに、新しいビューが利用可能で適切に動作するかどうかを常にアダプタに尋ねます。このような問題の解決策を見た人はいますか?

ところで、私が見た中で最も近いのはGoogle アプリのこのプロジェクトですが、事前に割り当てられた静的なビューのセットを期待しているようです。

提案をお寄せいただきありがとうございます!

4

0 に答える 0