您的位置:首页 > 移动开发 > Android开发

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

2013-07-18 10:40 736 查看
这两天项目要求需要实现一个新功能:要自定义组成实现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
/**  * Tab页面手势滑动切换以及动画效果  *   * @author jiangqq  *   */ public class MainActivity extends Activity { 	private ViewPager mPager;// 页卡内容 	private List<View> listViews; // Tab页面列表 	private ImageView cursor;// 动画图片 	private TextView t1, t2, t3;// 页卡头标 	private int offset = 0;// 动画图片偏移量 	private int currIndex = 0;// 当前页卡编号 	private int bmpW;// 动画图片宽度 	@Override 	public void onCreate(Bundle savedInstanceState) { 		super.onCreate(savedInstanceState); 		setContentView(R.layout.main); 		InitImageView(); 		InitTextView(); 		InitViewPager(); 	} 	/** 	 * 初始化头标 	 */ 	private void InitTextView() { 		t1 = (TextView) findViewById(R.id.text1); 		t2 = (TextView) findViewById(R.id.text2); 		t3 = (TextView) findViewById(R.id.text3); 		t1.setOnClickListener(new MyOnClickListener(0)); 		t2.setOnClickListener(new MyOnClickListener(1)); 		t3.setOnClickListener(new MyOnClickListener(2)); 	} 	/** 	 * 初始化ViewPager 	 */ 	private void InitViewPager() { 		mPager = (ViewPager) findViewById(R.id.vPager); 		listViews = new ArrayList<View>(); 		LayoutInflater mInflater = getLayoutInflater(); 		listViews.add(mInflater.inflate(R.layout.lay1, null)); 		listViews.add(mInflater.inflate(R.layout.lay2, null)); 		listViews.add(mInflater.inflate(R.layout.lay3, null)); 		mPager.setAdapter(new MyPagerAdapter(listViews)); 		mPager.setCurrentItem(0); 		mPager.setOnPageChangeListener(new MyOnPageChangeListener()); 	}  	/** 	 * 初始化动画 	 */ 	private void InitImageView() { 		cursor = (ImageView) findViewById(R.id.cursor); 		bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a) 				.getWidth();// 获取图片宽度 		DisplayMetrics dm = new DisplayMetrics(); 		getWindowManager().getDefaultDisplay().getMetrics(dm); 		int screenW = dm.widthPixels;// 获取分辨率宽度 		offset = (screenW / 3 - bmpW) / 2;// 计算偏移量 		Matrix matrix = new Matrix(); 		matrix.postTranslate(offset, 0); 		cursor.setImageMatrix(matrix);// 设置动画初始位置 	}   	/** 	 * 头标点击监听 	 */ 	public class MyOnClickListener implements View.OnClickListener { 		private int index = 0;  		public MyOnClickListener(int i) { 			index = i; 		}  		@Override 		public void onClick(View v) { 			mPager.setCurrentItem(index); 		} 	};  	/** 	 * 页卡切换监听 	 */ 	public class MyOnPageChangeListener implements OnPageChangeListener {  		int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量 		int two = one * 2;// 页卡1 -> 页卡3 偏移量  		@Override 		public void onPageSelected(int arg0) { 			Animation animation = null; 			switch (arg0) { 			case 0: 				if (currIndex == 1) { 					animation = new TranslateAnimation(one, 0, 0, 0); 				} else if (currIndex == 2) { 					animation = new TranslateAnimation(two, 0, 0, 0); 				} 				break; 			case 1: 				if (currIndex == 0) { 					animation = new TranslateAnimation(offset, one, 0, 0); 				} else if (currIndex == 2) { 					animation = new TranslateAnimation(two, one, 0, 0); 				} 				break; 			case 2: 				if (currIndex == 0) { 					animation = new TranslateAnimation(offset, two, 0, 0); 				} else if (currIndex == 1) { 					animation = new TranslateAnimation(one, two, 0, 0); 				} 				break; 			} 			currIndex = arg0; 			animation.setFillAfter(true);// True:图片停在动画结束位置 			animation.setDuration(300); 			cursor.startAnimation(animation); 		}  		@Override 		public void onPageScrolled(int arg0, float arg1, int arg2) { 		}  		@Override 		public void onPageScrollStateChanged(int arg0) { 		} 	}
ViewPager适配器类
/**  * ViewPager适配器  * @author jiangqingqing  *  */ public class MyPagerAdapter extends PagerAdapter {  	public List<View> mListViews;  	public MyPagerAdapter(List<View> mListViews) { 		this.mListViews = mListViews; 	}  	@Override 	public void destroyItem(View arg0, int arg1, Object arg2) { 		((ViewPager) arg0).removeView(mListViews.get(arg1)); 	}  	@Override 	public void finishUpdate(View arg0) { 	}  	@Override 	public int getCount() { 		return mListViews.size(); 	}  	@Override 	public Object instantiateItem(View arg0, int arg1) { 		((ViewPager) arg0).addView(mListViews.get(arg1), 0); 		return mListViews.get(arg1); 	}  	@Override 	public boolean isViewFromObject(View arg0, Object arg1) { 		return arg0 == (arg1); 	}  	@Override 	public void restoreState(Parcelable arg0, ClassLoader arg1) { 	}  	@Override 	public Parcelable saveState() { 		return null; 	}  	@Override 	public void startUpdate(View arg0) { 	}

上面那是主要实现功能的代码,详细代码可以在下面链接进行下载
http://download.csdn.net/detail/jiangqq781931404/5774527
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐