2016-03-30 39 views
0

Bir Atlıkarınca gibi davranan Özel bir ViewPager'ım var; bu, bir sayfada birden fazla sayfa göstermek istiyorum. Bunu yapmak için biz 2 çözümler var: marjları setPageMargin() yöntemini Özel ViewPager merkezi geçerli öğesi, özel bir getPageWidth ile Bağdaştırıcıda

  • kullanma

    • Ya da benim ViewPager ait adaptörün getPageWidth yöntemini geçersiz kılar kullanabilirsiniz.

    İlk çözüm harika çalışıyor ancak geçerli sayfamın yüzdesini tam olarak kesinleştirmek istiyorum. Sorun şu ki, getPageWidth çözümüyle mevcut sayfam solda değişiyor. Mantıklı, çünkü önceki büyüklüğünün sadece% 80'ini alıyor. Onun çalışma ama bu sadece gerçekten garip davranıyor, daha önce olduğu gibi kaydırma olamaz

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

    , 'iyi yönde Don gitmez: Ben böyle benim özel ViewPager ait scrollTo fonksiyonunu geçersiz kılmak için çalıştı Parmağımı takip edin ... Çalışmakta olan bir kaydırma ve ortalanmış bir sayfama sahip olmamı sağlayan bir çözüm var mı? İşte

    benim adaptör: Burada

    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; 
        } 
    } 
    

    Daha yararsız ama benim MainActivity geçerli:

    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); 
        } 
    } 
    

    Düzenleme:

    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(); 
          } 
         }); 
    

    Selamlar

  • cevap

    8

    Yerine setPageMargin veya getPageWidth Dolgu özelliğini yalnızca ViewPager'ınıza ayarlayabilirsiniz.

    <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" /> 
    

    Bildirim clipToPadding kısım, diğer sayfaları göstermek için önemlidir.

    ekranın x% olarak genişliğini göstermek istiyorsanız, sen Çözümünüz harika çalışıyor 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

    yılında sayesinde yapabilirsiniz! Sadece bir sorum var, bunu yapmak için bir iş parçacığı kullanmak gerçekten uygun mu? Bunu yapmak istediğim, ana iş parçasında bir dolgu yapabilir miyiz ya da berbat mı? – zed13

    +0

    'mRootView.getWidth();' görünüm zaten oluşturulmadığı ve genişliğinin Android tarafından hesaplanmadığı sürece çalışmaz. Bu ayrı bir iş parçacığı değil, UI iş parçacığı üzerinde çalışır, ancak yalnızca 'mRootView' tamamen oluşturuluncaya kadar ertelenir. – Sourabh

    +0

    Oh evet isterseniz, bunun yerine screenWidth' işlevini kullanabilirsiniz, doğru, unuttum, bilgi için tekrar teşekkürler. İyi günler. – zed13