2013-04-15 9 views
5

Muszę zapisać niestandardowe przejście dla ViewPagera w aplikacji z android:minSdkVersion="9".Problem z korzystaniem z ViewPager i PageTransformer z interfejsem API Androida <11

Próbuję uruchomić ZoomOutPageTransformer podana here.

mam żadnego błędu kompilacji, a na Samsung Galaxy S z systemem Android 2.3.3 (API 10), linia

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

nie daje żadnych błędów, ale kod w ZoomOutPageTransformer na transformPage nigdy nie jest stracony .

Kod działa idealnie, jeśli ustawię android:minSdkVersion="11" i użyję mojego Nexusa 4 (API 17).

Czy te PageTransformatory mogą być używane z API 9 i 10? W przeciwnym razie, w jaki sposób mogę utworzyć niestandardowe przejścia dla ViewPager?

EDIT

Oto kod używam:

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

    } 


} 

Odpowiedz

2

Ok: Dostałem odpowiedź na początku 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. 

użyję ViewFlipper zamiast .

+0

zastanawiałem się, czy istnieje jakikolwiek zakres łączących NineOldAndroids który przynosi propertyAnimation do poniżej 3,0, ale wątpię, możemy przesłonić widok pager i dodać kod do animacji własności –

+0

Dlaczego ten znak odpowiedzi jest akceptowany? Odpowiedź z @hellcast faktycznie działa, [see] (https://github.com/astinx/PageTransformerSupport) – 4gus71n

+0

Ponieważ to było 3 miesiące temu i pracuję teraz nad czymś zupełnie innym, więc nie testowałem tego. – jul

10

skopiowane klasę ViewPager z here i usunął if dla wersji i nazwał go 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(); 
    } 
} 

miałem też zmienić wszystkie PageTransformer do ViewPager.PageTransformer. Potem zrobił przemiany w ZoomOutPageTranformer takiego,

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

To działało nawet do 2,2

2

żadna z odpowiedzi powyżej są poprawne odpowiedzi, nawet jeśli pracują, Tu jest mój, nie zapomnij dodać nineoldandroids .jar do folderu libs:

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

Co, jeśli nie chcę używać słoika zamiast tego, chcę tylko użyć animacji? – Ahmed

+1

@Ahmed, jest OK, po prostu usuń ViewHelpers i użyj setPropery() bezpośrednio na widoku – MohammadReza

+1

Dzięki za sugestię EBLiS :) – Ahmed

Powiązane problemy