2013-04-15 8 views
5

Ho bisogno di scrivere una transizione personalizzata per un ViewPager su un'app con android:minSdkVersion="9".Problema utilizzando ViewPager e PageTransformer con API Android <11

Sto provando a eseguire il ZoomOutPageTransformer dato here.

ottengo nessun errore di compilazione, e su un Samsung Galaxy S con sistema operativo Android 2.3.3 (API 10), la linea di

pager.setPageTransformer(true, new ZoomOutPageTransformer()); 

non dà alcun errore, ma il codice in ZoomOutPageTransformer di transformPage non viene mai eseguito .

Il codice funziona perfettamente se imposto android:minSdkVersion="11" e utilizzo il mio Nexus 4 (API 17).

Questi PageTransformer possono essere utilizzati con API 9 e 10? Altrimenti, come posso creare transizioni personalizzate per ViewPager?

EDIT

Ecco il codice che uso:

public class HomeFragment extends Fragment{ 

    ViewPager mNewsTitlePager; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.home_content, container, false); 
    } 

    @Override 
    public void onActivityCreated (Bundle savedInstanceState){ 

     super.onActivityCreated(savedInstanceState); 

     mNewsTitlePager = (ViewPager) getView().findViewById(R.id.news_title_pager); 
     mNewsTitlePager.setPageTransformer(true, new ZoomOutPageTransformer()); 

     mNewsTitlePager.setAdapter(new NewsPagerAdapter(news_item_list)); 


    } 

    private class NewsPagerAdapter extends PagerAdapter { 

     private List<News> news_item_list; 
     private LayoutInflater inflater; 

     NewsPagerAdapter(List<News> news_item_list) { 
      this.news_item_list = news_item_list; 
      inflater = getActivity().getLayoutInflater(); 
     } 

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) { 
      ((ViewPager) container).removeView((View) object); 
     } 

     @Override 
     public void finishUpdate(View container) { 
     } 

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

     @Override 
     public Object instantiateItem(ViewGroup view, int position) { 
      TextView news_title = (TextView) inflater.inflate(R.layout.news_title_item, view, false); 

      news_title.setText(news_item_list.get(position).title); 

      ((ViewPager) view).addView(news_title, 0); 
      return news_title; 
     } 

     @Override 
     public boolean isViewFromObject(View view, Object object) { 
      return view.equals(object); 
     } 

     @Override 
     public void restoreState(Parcelable state, ClassLoader loader) { 
     } 

     @Override 
     public Parcelable saveState() { 
      return null; 
     } 

     @Override 
     public void startUpdate(View container) { 
     } 


    } 

    public class ZoomOutPageTransformer implements ViewPager.PageTransformer { 
     private float MIN_SCALE = 0.85f; 
     private float MIN_ALPHA = 0.5f; 

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

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

      } else if (position <= 1) { // [-1,1] 
       // Modify the default slide transition to shrink the page as well 
       float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); 
       float vertMargin = pageHeight * (1 - scaleFactor)/2; 
       float horzMargin = pageWidth * (1 - scaleFactor)/2; 
       if (position < 0) { 
        view.setTranslationX(horzMargin - vertMargin/2); 
       } else { 
        view.setTranslationX(-horzMargin + vertMargin/2); 
       } 

       // Scale the page down (between MIN_SCALE and 1) 
       view.setScaleX(scaleFactor); 
       view.setScaleY(scaleFactor); 

       // Fade the page relative to its size. 
       view.setAlpha(MIN_ALPHA + 
         (scaleFactor - MIN_SCALE)/
         (1 - MIN_SCALE) * (1 - MIN_ALPHA)); 

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

    } 


} 

risposta

2

Ok: ho avuto la risposta all'inizio della doc:

As property animation is only supported as of Android 3.0 and forward, setting a PageTransformer on a ViewPager on earlier platform versions will be ignored. 

userò ViewFlipper invece .

+0

si chiedeva se non v'è alcuna possibilità di NineOldAndroids fusione che porta il propertyAnimation al di sotto di 3,0, ma dubito che possiamo ignorare il cercapersone visualizzare e aggiungere il codice per l'animazione di proprietà –

+0

Perché questo segno di risposta è accettato? La risposta di @hellcast funziona davvero, [vedi] (https://github.com/astinx/PageTransformerSupport) – 4gus71n

+0

Perché era 3 mesi fa e sto lavorando a qualcosa di completamente diverso ora, quindi non l'ho testato. – jul

10

ho copiato la classe ViewPager da here e rimosso l'istruzione if per la versione e lo ha chiamato TransformableViewPager

public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) { 
    if (Build.VERSION.SDK_INT >= 11) { 
     final boolean hasTransformer = transformer != null; 
     final boolean needsPopulate = hasTransformer != (mPageTransformer != null); 
     mPageTransformer = transformer; 
     setChildrenDrawingOrderEnabledCompat(hasTransformer); 
     if (hasTransformer) { 
      mDrawingOrder = reverseDrawingOrder ? DRAW_ORDER_REVERSE : DRAW_ORDER_FORWARD; 
     } else { 
      mDrawingOrder = DRAW_ORDER_DEFAULT; 
     } 
     if (needsPopulate) populate(); 
    } 
} 

ho anche dovuto cambiare tutto PageTransformer a ViewPager.PageTransformer. Poi ha fatto le trasformazioni in ZoomOutPageTranformer come questo,

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){ 
    // > 11 version 
    view.setAlpha(0); 
} 
else 
{ 
    // Nine Old Androids version 
    ViewHelper.setAlpha(view, 0); 
} 

questo ha lavorato anche per 2.2

2

Nessuna delle risposte di cui sopra sono la risposta corretta, anche se lavorano, Qui è mio, non dimenticare di aggiungere nineoldandroids .jar alla cartella librerie:

public class ZoomOutPageTransformer implements ViewPager.PageTransformer { 
    private static final float MIN_SCALE = 0.85f; 
    private static final float MIN_ALPHA = 0.5f; 

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

     if (position < -1) { 
      ViewHelper.setAlpha(view, 0); 
     } else if (position <= 1) { // [-1,1] 
      float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); 
      float vertMargin = pageHeight * (1 - scaleFactor)/2; 
      float horzMargin = pageWidth * (1 - scaleFactor)/2; 
      if (position < 0) { 
       ViewHelper.setTranslationX(view,horzMargin - vertMargin/2); 
      } else { 
       ViewHelper.setTranslationX(view,-horzMargin + vertMargin/2); 
      } 
      ViewHelper.setScaleX(view,scaleFactor); 
      ViewHelper.setScaleY(view, scaleFactor); 
      ViewHelper.setAlpha(view, MIN_ALPHA + (scaleFactor - MIN_SCALE)/(1 - MIN_SCALE) * (1 - MIN_ALPHA)); 
     } else { 
      ViewHelper.setAlpha(view,0); 
     } 
    } 
} 
+0

E se non volessi usare il barattolo invece volessi usare l'animazione? – Ahmed

+1

@Ahmed, è OK, basta rimuovere ViewHelpers e utilizzare setPropery() direttamente sulla vista – MohammadReza

+1

Grazie per il suggerimento EBLiS :) – Ahmed

Problemi correlati