2013-04-15 64 views
5

我需要爲應用程序上的ViewPager編寫自定義轉換,其格式爲android:minSdkVersion="9"使用ViewPager和PageTransformer與Android API進行問題<11

我試圖運行ZoomOutPageTransformer給出here

我沒有得到任何編譯錯誤,並在三星Galaxy S運行Android 2.3.3(API 10),行

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

不給任何錯誤,但在ZoomOutPageTransformer的transformPage代碼永遠不會執行。

如果我設置了android:minSdkVersion="11"並使用了我的Nexus 4(API 17),該代碼完美工作。

這些PageTransformers可以與API 9和10一起使用嗎?否則,我如何爲ViewPager創建自定義轉換?

編輯

這是我使用的代碼:

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

    } 


} 

回答

2

好:我得到的答案在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. 

我會用ViewFlipper代替。

+0

不知道是否有是帶來propertyAnimation低於3.0合併NineOldAndroids的任何範圍,但我懷疑,我們可以覆蓋視圖尋呼機和屬性動畫添加代碼 –

+0

這個答案爲什麼被接受? @hellcast的答案確實有效,[見](https://github.com/astinx/PageTransformerSupport) – 4gus71n

+0

因爲它是3個月前的事情,我現在正在做一些完全不同的事情,所以我沒有測試過它。 – jul

10

我從here複製ViewPager類和刪除if語句的版本,並把它稱爲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(); 
    } 
} 

我也不得不所有PageTransformer改變ViewPager.PageTransformer。那時在ZoomOutPageTranformer這樣的轉變,

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

這2.2

2

無答案的上方是即使他們工作的正確答案,甚至工作, 這裏是我的,不要忘了添加nineoldandroids的.jar到你的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

如果我不想使用該jar而只是想使用動畫呢? – Ahmed

+1

@Ahmed,它的確定,只需刪除ViewHelpers並直接使用setPropery()在視圖 – MohammadReza

+1

感謝您的建議EBLiS :) – Ahmed