4

Android UIで次のことがどのように行われるかを理解しようとしています。私がこの問題を抱えているとは思いませんが、何を検索すればよいかわかりませんし、有用な情報もまだ見つかりませんでした。

私の状況:

現時点では、ページのフラグメントを取得するために FragmentStatePagerAdapter を拡張するクラスがあります。私は 1 つの「メイン」フラグメント (これはスクリーン フィルではありません!! <- ここでは非常に重要な情報です) と、それに続くいくつかのスクリーン フィル ページがあります。

また、ページが既に現在のページの背後にあるかのようにページを変換するPageTransformerもあります。) このページの DepthPageTransformer に似ています。ビューページャー

私の開始画面は次のようになります。 ここに画像の説明を入力

簡単に説明します。左側の角が丸い領域はメイン ページで、画面いっぱいに表示されません。そのメイン ページの背後には、2 番目のページが既に背景に表示されているはずです。メイン ページを左にスワイプすると、2 ページ目が次のアクティブ ページになります。

だから、ここに問題があります:

メイン ページの変換 (スワイプ) を開始するまで、2 番目のページは背景に表示されません。シナリオの作成を開始しました (問題のためまだ完了していません)。次のようになります。

ここに画像の説明を入力

奥の濃いグラデーションはandroidの標準グラデーションです。水色の部分が透明感のある引き延ばし画像です(パズルのピースの場合)

それで、メインページをスワイプし始めると、突然このようになります。メイン ページに戻った後、2 番目のページは引き続き表示されます。

ここに画像の説明を入力

これは、最初からあるべき状況です。

最初から 2 ページが表示されるようにするにはどうすればよいですか? これは主なアクティビティ コードです (基本的には、コメントなしの特定の android dev リンクからのコードです)。

public class MainActivity extends FragmentActivity {

    private static final int NUM_PAGES = 5;
    private ViewPager mPager;
    private PagerAdapter mPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_slider);

        // Instantiate a ViewPager and a PagerAdapter.
        mPager = (ViewPager) findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);
        mPager.setPageTransformer(true, new DepthPageTransformer());
    }

    @Override
    public void onBackPressed() {
        if (mPager.getCurrentItem() == 0) {
            super.onBackPressed();
        } else {
            mPager.setCurrentItem(mPager.getCurrentItem() - 1);
        }
    }

    /**
     * A simple pager adapter that represents 5 ScreenSlidePageFragment objects,
     * in sequence.
     */
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return new ScreenMainSlideFragment();
            }
            return new ScreenSlideFragment();
        }

        @Override
        public int getCount() {
            return NUM_PAGES;
        }
    }

}

そして、これがPageTransformerです(おそらく解決策があります):

public class DepthPageTransformer implements PageTransformer {
    private static float MIN_SCALE = 1f;

    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();

        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);

        } else if (position <= 0) { // [-1,0]
            // Use the default slide transition when moving to the left page
            view.setAlpha(1);
            view.setTranslationX(0);
            view.setScaleX(1);
            view.setScaleY(1);

        } else if (position <= 1) { // (0,1]
            // Fade the page out.
            view.setAlpha(0.75f + (1 - position) * 0.25f);

            // Counteract the default slide transition
            view.setTranslationX(pageWidth * -position);

            // Scale the page down (between MIN_SCALE and 1)
            float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position));
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);

        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
        }
    }
}

どうもありがとうございました!

4

1 に答える 1

2

これで問題が完全に解決するかどうかはわかりませんが、ViewPager のアダプターの getPageWidth メソッドを見たことがありますか。行きたい場所に役立つ可能性があります。

https://developer.android.com/reference/android/support/v4/view/PagerAdapter.html#getPageWidth(int)

アダプターの実装で 1 未満の値を返します。

...
private static final int POS_MAIN_PAGE = 0;
private static final float WIDTH_MAIN_PAGE = 0.9f;
...

...
@Override
public float getPageWidth (int position) {
    if (position == POS_MAIN_PAGE) {
        return WIDTH_MAIN_PAGE;
    }
    return 1f;
}
....

OPのコメントの後に更新:

最初のページと同時に 2 ページ目を表示する必要がある場合、aViewPagerは適切なコントロールではない可能性があります。a 内のページは、ViewPager上下に表示されるのではなく、隣り合わせに表示されます。

あなたができることは、あなたの最初のページ(位置== 0)にあなたのメインと「2nd」ページの両方を表示することです(メインページと「2nd」ページのViewPager両方を含むViewGroup/Fragmentメインページがわずかに小さい)。「2 番目の」ページは固定されており、メイン ページはスライド式の引き出しにすることができます。ユーザーがメイン ページ (つまりスライド ドロワー) で左方向にスワイプすると、メイン ページが見えなくなり、「2 番目の」ページが表示されたままになる可能性があります。ViewPagerユーザーが「2 番目」のページを左に向かってスワイプすると、ViewPager の「3 番目」のページが、ある画面から別の画面に移動する通常の方法(メインと「2 番目」のページの両方) で表示される可能性があります。見えなくなる。

于 2013-03-27T13:55:41.647 に答える