這周做了一個需求,使用viewpager實現圖片的滾動,我的需求是三張圖片,要求在滾動時,圖片在兩兩之間有淡入淡出效果,
要想實現這個效果,要在viewpager的滾動監聽中操作,首先看一下viewpager的滾動監聽函數
OnPageChangeListener這個接口需要實現三個方法:(onPageScrollStateChanged,onPageScrolled ,onPageSelected)
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
}
以上三個方法就是實現viewpager監聽器時,必須重寫的方法
onPageScrollStateChanged中的arg0參數有三種狀態,分別是0,1,2
安照我們滾動的順序講解(手指觸摸-手指滑動-手指擡起)
當我們手指觸摸到viewpager時,不滑動(就是你點擊viewpager,OnPagerChangeListener監聽器是不會監聽你的點擊操作的,也就是說你必須做滑動操作,OnPagerChangeListener纔會不觸發)viewpager的監聽器不會觸發。
當我們手指觸摸到viewpager時,進行了滑動(輕微也是滑動了),參數arg0這時的狀態值是1(1表示滑動),當然,當你滑動的時候,viewpager不會停留在這裏,隨着你的滑動,OnPagerChangeListener會調用 public void onPageScrolled(int arg0, float arg1, int arg2) 這個函數,
arg0:表示當前頁面,你是你滑動的頁面
arg1:表示你滑動時,當前頁面的偏移的百分比
arg2:表示滑動時,當前頁面的偏移像素位置
然後,當你手指擡起,這裏會有兩種情況
1:頁面沒有切換到下一頁,調用 onPageScrollStateChanged(int arg0),其中的arg0的狀態值arg0變成了2,這時會再次調用 public void onPageScrolled(int arg0, float arg1, int arg2)然後回到原位,回到原位過程中,調用onPageScrollStateChanged(int arg0)函數,其中的arg0變成了0,表示結束,看到這裏想必你已經看出來了,在沒有切換到新的頁面時,onPageScrollStateChanged(int arg0)點用了3次,對應了3中狀態值。
2:頁面切換到下一頁,調用onPageScrollStateChanged(int arg0),其中的arg0的狀態值arg0變成了2,然後緊接着調用了又一個方法 onPageSelected(int arg0) ,這個方法在切換頁面成功,纔會調用,然後和1情況一樣調用public void onPageScrolled(int arg0, float arg1, int arg2),但是區別在於,這有一個過渡過程,因爲最後arg0的值,會從當前也面的值(比如 i)變成下一個頁面的值(i+1),最後調用onPageScrollStateChanged(int arg0),其中的arg0變成了0,表示結束,看到這裏想必你已經看出來了,也調用了3次,所以只要可以滾動,它都會調用3次
還有一種特殊情況,就是你的viewpager就是第一頁,而你的viewpager是不帶循環滑動的,這時你想不能滑動的方向滑動,這時OnPagerChangeListener之調用onPageScrollStateChanged(int arg0) 中的arg0=1和arg0=0的狀態,因爲arg0=2表示滑動,頁面都沒有了,所以不會動的,所以只有兩種狀態,注意他們兩之間還是有onPageSelected(int arg0) 函數的調用的