2013-04-15 12 views
5

Tôi cần phải viết một chuyển đổi tùy chỉnh cho ViewPager trên ứng dụng với android:minSdkVersion="9".Sự cố khi sử dụng ViewPager và PageTransformer với API Android <11

Tôi đang cố gắng chạy ZoomOutPageTransformer được cung cấp here.

tôi nhận được không có lỗi biên dịch, và trên Samsung Galaxy S chạy Android 2.3.3 (API 10), dòng

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

không đưa ra bất cứ lỗi, nhưng các mã trong ZoomOutPageTransformer của transformPage không bao giờ được thực thi .

Mã hoạt động hoàn hảo nếu tôi đặt android:minSdkVersion="11" và sử dụng Nexus 4 (API 17).

Những Trình dịch chuyển trang này có thể được sử dụng với API 9 và 10 không? Nếu không, làm cách nào tôi có thể tạo chuyển tiếp tùy chỉnh cho ViewPager?

EDIT

Dưới đây là đoạn code tôi sử dụng:

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

    } 


} 

Trả lời

2

Ok: Tôi đã nhận được câu trả lời ở phần đầu của 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. 

tôi sẽ sử dụng ViewFlipper thay .

+0

đã tự hỏi nếu có bất kỳ phạm vi NineOldAndroids sáp nhập mà mang propertyAnimation xuống dưới 3.0, nhưng tôi nghi ngờ chúng ta có thể ghi đè lên pager xem và thêm mã cho hoạt hình sở hữu –

+0

Tại sao dấu câu trả lời này được chấp nhận? Câu trả lời từ @hellcast thực sự hoạt động, [xem] (https://github.com/astinx/PageTransformerSupport) – 4gus71n

+0

Bởi vì nó đã được 3 tháng trước và tôi đang làm việc trên một cái gì đó hoàn toàn khác nhau, vì vậy tôi đã không thử nghiệm nó. – jul

10

tôi sao chép lớp ViewPager từ here và loại bỏ các câu lệnh if cho phiên bản và gọi nó là 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(); 
    } 
} 

Tôi cũng đã phải thay đổi tất cả PageTransformer để ViewPager.PageTransformer. Sau đó, đã làm biến đổi trong ZoomOutPageTranformer như thế này,

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

này làm việc ngay cả đối với 2.2

2

Không ai trong số các câu trả lời trên là câu trả lời đúng ngay cả khi họ làm việc, Dưới đây là của tôi, đừng quên để thêm nineoldandroids .jar vào thư mục libs của bạn:

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

Nếu tôi không muốn sử dụng bình thay vì chỉ muốn sử dụng hình động? – Ahmed

+1

@Ahmed, OK của nó, chỉ cần loại bỏ ViewHelpers và sử dụng setPropery() trực tiếp trên xem – MohammadReza

+1

Cảm ơn bạn đã gợi ý EBLiS :) – Ahmed