2016-03-30 11 views
0

私は、カルーセルのように動作するカスタムViewPagerを持っていますが、1つに複数のページを表示できるようにしたいのです。マージンsetPageMargin()メソッド カスタムViewPagerは現在のアイテムをカスタムのgetPageWidthでアダプタに設定します

  • を使用して

    • それとも私のViewPagerのアダプタのgetPageWidthメソッドをオーバーライドします使用することができます。そうするために、我々は2つのソリューションを持っています。

    最初の解決策はうまくいきましたが、正確に現在のページの割合を正確に把握できるようにしたいと考えています。問題は、私の現在のページが左にシフトしているgetPageWidthソリューションです。彼女は以前のサイズの80%しかかからないので論理的です。それは働いているが、私はそれだけで本当に奇妙な演技、以前のようにスクロールすることはできません

    @Override 
        public void scrollTo(int x, int y) { 
         x = (int) (x - (getWidth() - getWidth()*getAdapter().getPageWidth(getCurrentItem()))/2); 
         super.scrollTo(x, y); 
        } 
    

    、「、良い方向にドンを行っていない。だから私はこのように私のカスタムViewPagerのscrollTo機能を無効にしてみました指をたどる...私は現在のページを中心に作業スクロールを持つことができるソリューションはありますか?ここで

    は私のアダプタです:

    import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentManager; 
    import android.support.v4.app.FragmentPagerAdapter; 
    import android.support.v4.view.ViewPager; 
    
    import java.util.ArrayList; 
    
    public class CarouselAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener { 
        private ArrayList<Entity> mData = new ArrayList<>(); 
        private ScaledRelativeLayout cur = null, next = null; 
    
        private float scale; 
        private MainActivity context; 
        private FragmentManager fragmentManager; 
    
        public CarouselAdapter(MainActivity context, FragmentManager fragmentManager, ArrayList<Entity> mData) { 
         super(fragmentManager); 
         this.fragmentManager = fragmentManager; 
         this.context = context; 
         this.mData = mData; 
        } 
    
        @Override 
        public float getPageWidth(int position) { 
         return (0.85f); 
        } 
    
        @Override 
        public Fragment getItem(int position) { 
         if (position == MainActivity.FIRST_PAGE) { 
          scale = MainActivity.BIG_SCALE; 
         } else { 
          scale = MainActivity.SMALL_SCALE; 
         } 
    
         position = position % mData.size(); 
    
         Fragment fragment = CarouselFragment.newInstance(context, mData.get(position), position, scale); 
         return fragment; 
        } 
    
        @Override 
        public int getCount() { 
         return mData.size(); 
        } 
    
        @Override 
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
         if (positionOffset >= 0f && positionOffset <= 1f) { 
          cur = getRootView(position); 
          cur.setScaleBoth(MainActivity.BIG_SCALE - MainActivity.DIFF_SCALE * positionOffset); 
    
          if (position < mData.size()-1) { 
           next = getRootView(position +1); 
           next.setScaleBoth(MainActivity.SMALL_SCALE + MainActivity.DIFF_SCALE * positionOffset); 
          } 
         } 
        } 
    
        @Override 
        public void onPageSelected(int position) {} 
    
        @Override 
        public void onPageScrollStateChanged(int state) {} 
    
        private ScaledRelativeLayout getRootView(int position) { 
         return (ScaledRelativeLayout) fragmentManager.findFragmentByTag(this.getFragmentTag(position)).getView().findViewById(R.id.rootItem); 
        } 
    
        private String getFragmentTag(int position) { 
         return "android:switcher:" + context.carousel.getId() + ":" + position; 
        } 
    } 
    
    ここ

    もっと役に立たないけど、私のMainActivityです:

    import android.support.v4.app.FragmentActivity; 
    import android.os.Bundle; 
    import android.view.Menu; 
    import android.view.MenuItem; 
    import android.widget.Button; 
    
    import java.util.ArrayList; 
    
    public class MainActivity extends FragmentActivity { 
        public static int FIRST_PAGE; 
        public final static float BIG_SCALE = 1.0f; 
        public final static float SMALL_SCALE = 0.85f; 
        public final static float DIFF_SCALE = BIG_SCALE - SMALL_SCALE; 
    
        public CarouselViewPager carousel; 
        private CarouselAdapter carouselAdapter; 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
    
         FIRST_PAGE = mData.size()/2; 
         carouselAdapter = new CarouselAdapter(this, this.getSupportFragmentManager(), mData); 
         carousel = (CarouselViewPager) findViewById(R.id.carousel); 
         carousel.setAdapter(carouselAdapter); 
         carousel.addOnPageChangeListener(carouselAdapter); 
         carousel.setCurrentItem(Math.round(FIRST_PAGE)); 
         carousel.setOffscreenPageLimit(3); 
         carousel.setClipToPadding(false); 
         carousel.setScrollDurationFactor(2.5f); 
        } 
    } 
    

    編集:

    root.post(new Runnable() { 
          @Override 
          public void run() { 
           int width = root.getWidth(); 
           Log.w("Post", "Width : " + width + ", newWidth : " + (width * 0.8)); 
           // root.setPadding((int) (width * 0.125), 0, (int) (width * 0.125), 0); 
    
           ViewPager.LayoutParams params = (ViewPager.LayoutParams) root.getLayoutParams(); 
           params.width = (int) (width * 0.8); 
           root.setLayoutParams(params); 
           root.requestLayout(); 
           root.forceLayout(); 
           root.invalidate(); 
          } 
         }); 
    

    よろしく

  • 答えて

    8

    代わりのsetPageMargingetPageWidthあなたのViewPagerにパディングを設定することができます。

    <android.support.v4.view.ViewPager 
        android:id="@+id/main_container" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:paddingLeft="16dp" 
        android:paddingRight="16dp" 
        android:clipToPadding="false" /> 
    

    clipToPadding部分に注意してください。他のページを表示することが重要です。

    あなたは、画面のx%として、あなたの幅を表示したい場合、あなたは、あなたのソリューションは素晴らしい作品のJava

    mRootView.post(new Runnable() { 
        @Override 
        public void run() { 
         int w = mRootView.getWidth(); 
         mViewPager.setPadding(w * 0.25, 0, w * 0.25, 0); 
         // 25% padding on either side so pages takes exactly 50% space 
        } 
    }); 
    
    +0

    に感謝し、これを行うことができます!私はちょうど質問があります、これを行うためにスレッドを使用することは本当に関係がありますか?私たちはメインスレッドでこれを行うことができますか、それはひどいですか? – zed13

    +0

    'mRootView.getWidth();'はビューが既に作成されていて、その幅がAndroidによって計算されない限り動作しません。これは別のスレッドではなく、UIスレッドで実行されますが、 'mRootView'が完全に作成されるまで遅延されます。代わりに 'screenWidth'を使用することができます。 – Sourabh

    +0

    ああ、そうです、忘れました、情報のおかげで再び。良い一日を。 – zed13

    関連する問題