1. 程式人生 > >SlidingMenu與ViewPager雙向滑動的解決方案

SlidingMenu與ViewPager雙向滑動的解決方案

最近研究SlidingMenu開源庫,發現它裡面有一個ViewPagerActivity的例子。但在這個例子中,ViewPager只支援單向滑動。稍作一點修改,即可實現雙向滑動。

  • 原始的ViewPagerActivity.java程式碼。
  1. publicclass ViewPagerActivity extends BaseActivity {  
  2.     public ViewPagerActivity() {  
  3.         super(R.string.viewpager);  
  4.     }  
  5.     @Override
  6.     publicvoid onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         ViewPager vp = new ViewPager(this);  
  9.         vp.setId("VP".hashCode());  
  10.         vp.setAdapter(new ColorPagerAdapter(getSupportFragmentManager()));  
  11.         setContentView(vp);  
  12.         vp.setOnPageChangeListener(new OnPageChangeListener() {  
  13.             @Override
  14.             publicvoid onPageScrollStateChanged(int arg0) {  
  15.             }  
  16.             @Override
  17.             publicvoid onPageScrolled(int arg0, float arg1, int arg2) {  
  18.             }  
  19.             @Override
  20.             publicvoid onPageSelected(int position) {  
  21.                 switch
     (position) {  
  22.                 case0:  
  23.                     getSlidingMenu().setTouchModeAbove(  
  24.                             SlidingMenu.TOUCHMODE_FULLSCREEN);  
  25.                     break;  
  26.                 default:  
  27.                     getSlidingMenu().setTouchModeAbove(  
  28.                             SlidingMenu.TOUCHMODE_MARGIN);  
  29.                     break;  
  30.                 }  
  31.             }  
  32.         });  
  33.         vp.setCurrentItem(0);  
  34.         getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);  
  35.     }  
  36.     publicclass ColorPagerAdapter extends FragmentPagerAdapter {  
  37.         private ArrayList<Fragment> mFragments;  
  38.         privatefinalint[] COLORS = newint[] { R.color.red, R.color.green,  
  39.                 R.color.blue, R.color.white, R.color.black };  
  40.         public ColorPagerAdapter(FragmentManager fm) {  
  41.             super(fm);  
  42.             mFragments = new ArrayList<Fragment>();  
  43.             for (int color : COLORS)  
  44.                 mFragments.add(new ColorFragment(color));  
  45.         }  
  46.         @Override
  47.         publicint getCount() {  
  48.             return mFragments.size();  
  49.         }  
  50.         @Override
  51.         public Fragment getItem(int position) {  
  52.             return mFragments.get(position);  
  53.         }  
  54.     }  
  55. }  

  • 改動後的ViewPagerActivity.java程式碼。
  1. publicclass ViewPagerActivity extends BaseActivity {  
  2.     public ViewPagerActivity() {  
  3.         super(R.string.viewpager);  
  4.     }  
  5.     @Override
  6.     publicvoid onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         getSlidingMenu().setSecondaryMenu(R.layout.menu_frame_two);  
  9.         getSlidingMenu().setSecondaryShadowDrawable(R.drawable.shadowright);  
  10.         getSupportFragmentManager().beginTransaction().replace(R.id.menu_frame_two, new SampleListFragment()).commit();  
  11.         ViewPager vp = new ViewPager(this);  
  12.         vp.setId("VP".hashCode());  
  13.         final ColorPagerAdapter cpa = new ColorPagerAdapter(getSupportFragmentManager());  
  14.         vp.setAdapter(cpa);  
  15.         setContentView(vp);  
  16.         vp.setOnPageChangeListener(new OnPageChangeListener() {  
  17.             @Override
  18.             publicvoid onPageScrollStateChanged(int arg0) {  
  19.             }  
  20.             @Override
  21.             publicvoid onPageScrolled(int arg0, float arg1, int arg2) {  
  22.             }  
  23.             @Override
  24.             publicvoid onPageSelected(int position) {  
  25.                 int lastPostion = cpa.getCount() - 1;  
  26.                 //請看這裡
  27.                 if (position == 0) {  
  28.                     getSlidingMenu().setMode(SlidingMenu.LEFT); // 第一個。SlidingMenu僅有左邊有效
  29.                     getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);  
  30.                 } elseif (position == lastPostion) {  
  31.                     getSlidingMenu().setMode(SlidingMenu.RIGHT); // 最後一個。SlidingMenu僅有右邊有效
  32.                     getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);  
  33.                 } else {  
  34.                     getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE); // 中間,SlidingMenu無效
  35.                 }  
  36.             }  
  37.         });  
  38.         vp.setCurrentItem(0);  
  39.         getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);  
  40.         getSlidingMenu().setMode(SlidingMenu.LEFT);  
  41.     }  
  42.     publicclass ColorPagerAdapter extends FragmentPagerAdapter {  
  43.         private ArrayList<Fragment> mFragments;  
  44.         privatefinalint[] COLORS = newint[] { R.color.red, R.color.green, R.color.blue, R.color.white, R.color.black };  
  45.         public ColorPagerAdapter(FragmentManager fm) {  
  46.             super(fm);  
  47.             mFragments = new ArrayList<Fragment>();  
  48.             for (int color : COLORS)  
  49.                 mFragments.add(new ColorFragment(color));  
  50.         }  
  51.         @Override
  52.         publicint getCount() {  
  53.             return mFragments.size();  
  54.         }  
  55.         @Override
  56.         public Fragment getItem(int position) {  
  57.             return mFragments.get(position);  
  58.         }  
  59.     }  
  60. }