0

私は特殊な eBook アプリケーションに取り組んでいます。要件の 1 つは、一度に 1 ページのテキストのみを表示し、書式設定などを行う必要があることです。これは思ったより難しいことがわかりましたが、最終的に成功することができました。

ただし、現在、別の問題に遭遇しました。つまり、クライアントは、ページが指に追従する ViewPager スタイルのページ間を行ったり来たりできるようにしたいと考えています。現在、これらの本や経典のページ数は事前に決定されていません。章が読み込まれるたびにオンザフライで計算されるため、ビューはテキスト サイズの変更などを自動的に処理します。

「無制限のViewPagerフリッピング」のさまざまな形式を調べてきましたが、これまでのところ、目的に合ったものを見つけることができませんでした.

私が考えていたこと、そして誰かが私を助けてくれることを願っているのはこれです:

  • 3ページくらい。現在表示されているものと、反転用に両側に 1 つずつ。
  • ユーザーが新しいページをめくると、ビューが舞台裏で切り替わり、新しいページが真ん中のページになり、前に表示したページを反対側に移動しながら次のページを読み込みます。
  • ジェスチャ追従を含むアニメーションが他の方法で実現できる場合、技術的には ViewPager である必要はありません。

これをすぐに解決したいので、これに追加の評判ポイントを提供しますが、残念ながら、まだ多くの評判ポイントを獲得できていません.

4

2 に答える 2

0

ViewPager で問題を解決したい場合は、onCreate メソッドでこれが必要です。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mPager = (ViewPager) findViewById(R.id.pager);
    android.support.v4.app.FragmentManager fm = getSupportFragmentManager();

    // Capture ViewPager page swipes
    ViewPager.SimpleOnPageChangeListener ViewPagerListener = new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            super.onPageSelected(position);

            if (fistswitch) {
                mPager.setCurrentItem(1);
                fistswitch = false;
            } else {
                // here you can use the replace method, to switch the
                // fragment behind the scenes
                ArrayList<Fragment> fragmentList = new ArrayList<Fragment>();
                Collections.addAll(fragmentList, new Fr2(), new Fr3(), new Fr4());

                mPagerAdapter.addFragments(fragmentList);
                // after the first switch you can use the the second page
                // continuously as middle
                mPager.setCurrentItem(1);
            }
        }
    };
    mPager.setOnPageChangeListener(ViewPagerListener);
    mPagerAdapter = new ViewPagerAdapter(fm);
    mPager.setAdapter(mPagerAdapter);
    ArrayList<Fragment> fragmentList = new ArrayList<Fragment>();
    Collections.addAll(fragmentList, new Fr1(), new Fr2(), new Fr3());

    mPagerAdapter.addFragments(fragmentList);

}

ページャー アダプター クラスは、次のようにアクティビティ内でプライベート クラスにすることができます。

private class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private List<Fragment> fragmentList = new ArrayList<Fragment>();

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    public void addFragments(List<Fragment> fragments) {
        fragmentList.clear();
        fragmentList.addAll(fragments);
        notifyDataSetChanged();
    }

    public void replaceFragment(int position, Fragment fr) {
        fragmentList.remove(position);
        fragmentList.add(position, fr);
        notifyDataSetChanged();
    }

    @Override
    public int getItemPosition(Object object) {
        if (fragmentList.contains(object)) {
            return POSITION_UNCHANGED;
        }
        return POSITION_NONE;
    }

    @Override
    public Fragment getItem(int item) {
        if (item >= fragmentList.size()) {
            return null;
        }
        return fragmentList.get(item);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }
}

コードをテストしていませんが、同様のケースで機能します。

于 2013-07-26T00:24:29.793 に答える