转自:http://blog.csdn.net/xipiaoyouzi/article/details/12121131
android ViewPager滑动事件讲解
今天在做项目的时候,由于要处理viewPager页面滑动的事件,所以对其进行了一个小小的研究:
首先ViewPager在处理滑动事件的时候要用到OnPageChangeListener
OnPageChangeListener这个接口需要实现三个方法:(onPageScrollStateChanged,onPageScrolled ,onPageSelected)
onPageScrollStateChanged(int arg0) ,此方法是在状态改变的时候调用,其中arg0这个参数
有三种状态(0,1,2)。arg0 ==1的时辰默示正在滑动,arg0==2的时辰默示滑动完毕了,arg0==0的时辰默示什么都没做。
当页面开始滑动的时候,三种状态的变化顺序为(1,2,0),演示如下:
当viewPager状态改变时候的代码块:
打印结果:
onPageScrolled(int arg0,float arg1,int arg2) ,当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回一直得到
调用。其中三个参数的含义分别为:
arg0 :当前页面,及你点击滑动的页面
arg1:当前页面偏移的百分比
arg2:当前页面偏移的像素位置
(参见官网:http://docs.eoeandroid.com/reference/android/support/v4/view/ViewPager.OnPageChangeListener.html#onPageScrolled(int, float, int))
演示如下:
页面滚动时侯代码:
日志打印:
onPageSelected(int arg0) : 此方法是页面跳转完后得到调用,arg0是你当前选中的页面的Position(位置编号)。
http://blog.csdn.net/lan410812571/article/details/9063161
import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.util.Log; import com.meityitian.app.utils.Debug; /** * 重写,添加了判定滑动方向的方法 * @author zxy * */ public class meityitianViewPager extends ViewPager { private boolean left = false; private boolean right = false; private boolean isScrolling = false; private int lastValue = -1; private ChangeViewCallback changeViewCallback = null; public meityitianViewPager(Context context, AttributeSet attrs) { super(context, attrs); init(); } public meityitianViewPager(Context context) { super(context); init(); } /** * init method . */ private void init() { setOnPageChangeListener(listener); } /** * listener ,to get move direction . */ public OnPageChangeListener listener = new OnPageChangeListener() { @Override public void onPageScrollStateChanged(int arg0) { if (arg0 == 1) {//手按着屏幕在滑动 isScrolling = true; } else {//手松开后 isScrolling = false; } Debug.infoByTag("meityitianViewPager", "meityitianViewPager onPageScrollStateChanged : arg0:" + arg0); if (arg0 == 2) {//手松开,停止滑动屏幕 Debug.infoByTag("meityitianViewPager", "meityitianViewPager onPageScrollStateChanged direction left ? " + left); Debug.infoByTag("meityitianViewPager", "meityitianViewPager onPageScrollStateChanged direction right ? " + right); //notify .... if(changeViewCallback!=null){ changeViewCallback.changeView(left, right); } right = left = false; } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { if (isScrolling) {//手触着屏幕滑动着 if (lastValue > arg2) { // 递减,向右侧滑动,arg2是以屏幕的分辨率来定的,比如我手机是720*1280,这里一开始向右滑,打出arg2有719,710,....,当手一松后,如果view继续向右滑动,那么arg2就会减少到0,而如果它回到左侧时,那arg2又会变到720 right = true; left = false; } else if (lastValue < arg2) { // 递增,向左侧滑动,从0开始递增 right = false; left = true; } else if (lastValue == arg2) { right = left = false; } } Log.i("meityitianViewPager", "meityitianViewPager onPageScrolled last :arg2 ," + lastValue + ":" + arg2); lastValue = arg2; } @Override public void onPageSelected(int arg0) { if(changeViewCallback!=null){ changeViewCallback.getCurrentPageIndex(arg0); } } }; /** * 得到是否向右侧滑动 * @return true 为右滑动 */ public boolean getMoveRight(){ return right; } /** * 得到是否向左侧滑动 * @return true 为左做滑动 */ public boolean getMoveLeft(){ return left; } /** * 滑动状态改变回调 * @author zxy * */ public interface ChangeViewCallback{ /** * 切换视图 ?决定于left和right 。 * @param left * @param right */ public void changeView(boolean left,boolean right); public void getCurrentPageIndex(int index); } /** * set ... * @param callback */ public void setChangeViewCallback(ChangeViewCallback callback){ changeViewCallback = callback; } }