viewpager.setOnPageChangeListener (new OnPageChangeListener() { @Override public void onPageSelected(int select) { // TODO Auto-generated method stub Log. d( "dml", "onPageSelected:::::select ============ " + select) ; } @Override public void onPageScrolled(int positon, float arg1, int arg2 ) { // TODO Auto-generated method stub Log. d( "dml", "onPageScrolled:::::position = " + positon); } @Override public void onPageScrollStateChanged(int state) { // TODO Auto-generated method stub Log. d( "dml", "onPageScrollStateChanged:::::state = " + state) ; } });
1. position永远是当前界面从左往右的第一个界面的index,不管你是否在滑动 所以一开始没有滑动onPageScrolled也会调用一次,并且position=0.
滑动其实分为两个过程:首先手指带动viewpager滑动,然后手指离开屏幕viewpager会自己处理(要么回弹 要么滑动到下一个界面),这整个过程onPageScrolled都会回调,当然position会一直变化
2. onPageScrollStateChanged会在一次滑动中回调三次,顺序是 1
> 2 > 0 其中2就是手指离开屏幕了,滑动事件成功了,onPageSelected肯定是在这个 2 后一步执行,而且只有当前界面有变化才回调,赋值位当前界面index,所以回弹了onPageSelected它就不会回调的
3. 要判断用户往哪边滑,就应该用两个条件一起判断:当前界面 int index,滑动的position. 比如: 当前在第二个界面,那么 int index = 1,此时position = 1,用户开始滑向第一个界面position立刻变为0(因为第一个界面已经漏出来了)
如果是往第三个界面滑动,position会保持为1(因为第二个界面还没完全隐藏呢),直到完全滑到第三个界面position=2 好,那现在继续左滑因为已经到最右了划不动 所以position此时一直保持2,同样的在第一个界面右滑 position会一直保持为0
时间: 2024-10-11 22:45:58