使用ViewPager+GridView实现横向滑动的效果(一)

来源:互联网 发布:mac 红警 编辑:程序博客网 时间:2024/05/18 15:53

转载自:http://blog.csdn.net/developer_jiangqq/article/details/9363919

       这两天项目要求需要实现一个新功能:要自定义组成实现GridView可以进行横向的滑动,刚开始想了好几种方法,都不行,最后用ViewPager滑动加上Gridview才解决,废话不多说了,直接开始学习。
        首先得学习一下ViewPager的使用,网上面关于这个描述很多的,我就是直接复制了一下:
         ViewPager类提供了多界面切换的新效果。新效果有如下特征:
[1] 当前显示一组界面中的其中一个界面。
[2] 当用户通过左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分。

[3]滑动结束后,界面自动跳转到当前选择的界面中

          介绍里面几个比较重要的方法与接口

    1,OnPageChangeListener  ViewPager页面进行切换监听接口  其中我们经常要实现public void onPageSelected(int arg0),public void onPageScrolled(int arg0, float arg1, int arg2),public void onPageScrollStateChanged(int arg0)着三个方面,其中第一个方法是更多的用到;

    2,setCurrentItem(int item),来设置跳转到当前的页面;

    3,要显示ViewPager,当然还少不了PagerAdapter类,进行适配;其中我们经常也要实现以下方法才可以:public void destroyItem(View arg0, int arg1, Object arg2),public int getCount(),public Object instantiateItem(View arg0, int arg1),public boolean isViewFromObject(View arg0, Object arg1),具体的使用方法等会看例子就ok了。

   

   好了我们, 直接看代码吧 ,今天来实现一个页面切换的效果截图如下:

   

    MainActivity.java

[java] view plaincopy
  1. /** 
  2.  * Tab页面手势滑动切换以及动画效果 
  3.  *  
  4.  * @author jiangqq 
  5.  *  
  6.  */  
  7. public class MainActivity extends Activity {  
  8.     private ViewPager mPager;// 页卡内容  
  9.     private List<View> listViews; // Tab页面列表  
  10.     private ImageView cursor;// 动画图片  
  11.     private TextView t1, t2, t3;// 页卡头标  
  12.     private int offset = 0;// 动画图片偏移量  
  13.     private int currIndex = 0;// 当前页卡编号  
  14.     private int bmpW;// 动画图片宽度  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.main);  
  19.         InitImageView();  
  20.         InitTextView();  
  21.         InitViewPager();  
  22.     }  
  23.     /** 
  24.      * 初始化头标 
  25.      */  
  26.     private void InitTextView() {  
  27.         t1 = (TextView) findViewById(R.id.text1);  
  28.         t2 = (TextView) findViewById(R.id.text2);  
  29.         t3 = (TextView) findViewById(R.id.text3);  
  30.         t1.setOnClickListener(new MyOnClickListener(0));  
  31.         t2.setOnClickListener(new MyOnClickListener(1));  
  32.         t3.setOnClickListener(new MyOnClickListener(2));  
  33.     }  
  34.     /** 
  35.      * 初始化ViewPager 
  36.      */  
  37.     private void InitViewPager() {  
  38.         mPager = (ViewPager) findViewById(R.id.vPager);  
  39.         listViews = new ArrayList<View>();  
  40.         LayoutInflater mInflater = getLayoutInflater();  
  41.         listViews.add(mInflater.inflate(R.layout.lay1, null));  
  42.         listViews.add(mInflater.inflate(R.layout.lay2, null));  
  43.         listViews.add(mInflater.inflate(R.layout.lay3, null));  
  44.         mPager.setAdapter(new MyPagerAdapter(listViews));  
  45.         mPager.setCurrentItem(0);  
  46.         mPager.setOnPageChangeListener(new MyOnPageChangeListener());  
  47.     }  
  48.   
  49.     /** 
  50.      * 初始化动画 
  51.      */  
  52.     private void InitImageView() {  
  53.         cursor = (ImageView) findViewById(R.id.cursor);  
  54.         bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a)  
  55.                 .getWidth();// 获取图片宽度  
  56.         DisplayMetrics dm = new DisplayMetrics();  
  57.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
  58.         int screenW = dm.widthPixels;// 获取分辨率宽度  
  59.         offset = (screenW / 3 - bmpW) / 2;// 计算偏移量  
  60.         Matrix matrix = new Matrix();  
  61.         matrix.postTranslate(offset, 0);  
  62.         cursor.setImageMatrix(matrix);// 设置动画初始位置  
  63.     }  
  64.   
  65.   
  66.     /** 
  67.      * 头标点击监听 
  68.      */  
  69.     public class MyOnClickListener implements View.OnClickListener {  
  70.         private int index = 0;  
  71.   
  72.         public MyOnClickListener(int i) {  
  73.             index = i;  
  74.         }  
  75.   
  76.         @Override  
  77.         public void onClick(View v) {  
  78.             mPager.setCurrentItem(index);  
  79.         }  
  80.     };  
  81.   
  82.     /** 
  83.      * 页卡切换监听 
  84.      */  
  85.     public class MyOnPageChangeListener implements OnPageChangeListener {  
  86.   
  87.         int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量  
  88.         int two = one * 2;// 页卡1 -> 页卡3 偏移量  
  89.   
  90.         @Override  
  91.         public void onPageSelected(int arg0) {  
  92.             Animation animation = null;  
  93.             switch (arg0) {  
  94.             case 0:  
  95.                 if (currIndex == 1) {  
  96.                     animation = new TranslateAnimation(one, 000);  
  97.                 } else if (currIndex == 2) {  
  98.                     animation = new TranslateAnimation(two, 000);  
  99.                 }  
  100.                 break;  
  101.             case 1:  
  102.                 if (currIndex == 0) {  
  103.                     animation = new TranslateAnimation(offset, one, 00);  
  104.                 } else if (currIndex == 2) {  
  105.                     animation = new TranslateAnimation(two, one, 00);  
  106.                 }  
  107.                 break;  
  108.             case 2:  
  109.                 if (currIndex == 0) {  
  110.                     animation = new TranslateAnimation(offset, two, 00);  
  111.                 } else if (currIndex == 1) {  
  112.                     animation = new TranslateAnimation(one, two, 00);  
  113.                 }  
  114.                 break;  
  115.             }  
  116.             currIndex = arg0;  
  117.             animation.setFillAfter(true);// True:图片停在动画结束位置  
  118.             animation.setDuration(300);  
  119.             cursor.startAnimation(animation);  
  120.         }  
  121.   
  122.         @Override  
  123.         public void onPageScrolled(int arg0, float arg1, int arg2) {  
  124.         }  
  125.   
  126.         @Override  
  127.         public void onPageScrollStateChanged(int arg0) {  
  128.         }  
  129.     }  
       ViewPager适配器类

     

[java] view plaincopy
  1. /** 
  2.  * ViewPager适配器 
  3.  * @author jiangqingqing 
  4.  * 
  5.  */  
  6. public class MyPagerAdapter extends PagerAdapter {  
  7.   
  8.     public List<View> mListViews;  
  9.   
  10.     public MyPagerAdapter(List<View> mListViews) {  
  11.         this.mListViews = mListViews;  
  12.     }  
  13.   
  14.     @Override  
  15.     public void destroyItem(View arg0, int arg1, Object arg2) {  
  16.         ((ViewPager) arg0).removeView(mListViews.get(arg1));  
  17.     }  
  18.   
  19.     @Override  
  20.     public void finishUpdate(View arg0) {  
  21.     }  
  22.   
  23.     @Override  
  24.     public int getCount() {  
  25.         return mListViews.size();  
  26.     }  
  27.   
  28.     @Override  
  29.     public Object instantiateItem(View arg0, int arg1) {  
  30.         ((ViewPager) arg0).addView(mListViews.get(arg1), 0);  
  31.         return mListViews.get(arg1);  
  32.     }  
  33.   
  34.     @Override  
  35.     public boolean isViewFromObject(View arg0, Object arg1) {  
  36.         return arg0 == (arg1);  
  37.     }  
  38.   
  39.     @Override  
  40.     public void restoreState(Parcelable arg0, ClassLoader arg1) {  
  41.     }  
  42.   
  43.     @Override  
  44.     public Parcelable saveState() {  
  45.         return null;  
  46.     }  
  47.   
  48.     @Override  
  49.     public void startUpdate(View arg0) {  
  50.     }  

          上面那是主要实现功能的代码,详细代码可以在下面链接进行下载

           http://download.csdn.net/detail/jiangqq781931404/5774527


0 0