2013-04-15 9 views
5

android:minSdkVersion="9"のアプリでViewPagerのカスタムトランジションを作成する必要があります。Android APIでViewPagerとPageTransformerを使用する場合の問題<11

私はZoomOutPageTransformerを指定してhereを実行しようとしています。

私はコンパイルエラーを取得していない、とサムスンギャラクシーSは、Android 2.3.3(API 10)を実行している上、ライン

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

は、すべてのエラーを与えるものではありませんが、ZoomOutPageTransformerのtransformPageでコードが実行されることはありません。

android:minSdkVersion="11"を設定してNexus 4(API 17)を使用すると、コードは完全に機能します。

これらのPageTransformerは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

OK::

EDIT

は、ここで私が使用したコードだ私が代わりにViewFlipperを使用します

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. 

:私はdocの冒頭に答えを得ました。

+0

は思っていたが、私たちは、ビューページャをオーバーライドし、プロパティのアニメーションのためのコードを追加することができます疑う –

+0

このアンサーマークはなぜ受け入れられますか? @hellcastの答えは実際には動作します。[参照](https://github.com/astinx/PageTransformerSupport) – 4gus71n

+0

これは3か月前のことで、今はまったく別のものに取り組んでいるので、テストしていません。 – jul

10

私はまたViewPager.PageTransformerにすべてPageTransformerを変更しなければならなかった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(); 
    } 
} 

それを呼びました。そして、このような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を追加することを忘れないでくださいでものために働きましたあなたのlibsフォルダにの.jar:3.0以下にpropertyAnimationをもたらすNineOldAndroidsをマージするのいずれかのスコープがある場合

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、そのOK、ViewHelpersを削除して、ビューで直接setPropery()を使用してください – MohammadReza

+1

提案ありがとうございますEBLiS :) – Ahmed

関連する問題