ViewPager的setOnPageChangeListener方法詳解
ViewPage使用時(shí),最關(guān)鍵的代碼就是setOnPageChangeListener,傳入一個(gè)ViewPager.SimpleOnPageChangeListener對(duì)象。ViewPager.SimpleOnPageChangeListener是個(gè)接口,有三個(gè)方法,下面做介紹。
注:ViewPager有兩個(gè)操作,一個(gè)是用手指滑動(dòng)翻頁(yè),一個(gè)是直接setCurrentItem(一般用于點(diǎn)擊上面的tab直接setCurrentItem)。下面的方法介紹也會(huì)針對(duì)這兩種情況分別介紹。
最后還會(huì)討論這三個(gè)方法相對(duì)執(zhí)行順序的問(wèn)題。
1.onPageSelected(int position):這個(gè)方法有一個(gè)參數(shù)position,代表哪個(gè)頁(yè)面被選中。當(dāng)用手指滑動(dòng)翻頁(yè)的時(shí)候,如果翻動(dòng)成功了(滑動(dòng)的距離夠長(zhǎng)),手指抬起來(lái)就會(huì)立即執(zhí)行這個(gè)方法,position就是當(dāng)前滑動(dòng)到的頁(yè)面。如果直接setCurrentItem翻頁(yè),那position就和setCurrentItem的參數(shù)一致,這種情況在onPageScrolled執(zhí)行方法前就會(huì)立即執(zhí)行。
2.onPageScrolled(int position,float positionOffset, int positionOffsetPixels):這個(gè)方法會(huì)在屏幕滾動(dòng)過(guò)程中不斷被調(diào)用。
有三個(gè)參數(shù),第一個(gè)position,這個(gè)參數(shù)要特別注意一下。當(dāng)用手指滑動(dòng)時(shí),如果手指按在頁(yè)面上不動(dòng),position和當(dāng)前頁(yè)面index是一致的;如果手指向左拖動(dòng)(相應(yīng)頁(yè)面向右翻動(dòng)),這時(shí)候position大部分時(shí)間和當(dāng)前頁(yè)面是一致的,只有翻頁(yè)成功的情況下最后一次調(diào)用才會(huì)變?yōu)槟繕?biāo)頁(yè)面;如果手指向右拖動(dòng)(相應(yīng)頁(yè)面向左翻動(dòng)),這時(shí)候position大部分時(shí)間和目標(biāo)頁(yè)面是一致的,只有翻頁(yè)不成功的情況下最后一次調(diào)用才會(huì)變?yōu)樵?yè)面。
當(dāng)直接設(shè)置setCurrentItem翻頁(yè)時(shí),如果是相鄰的情況(比如現(xiàn)在是第二個(gè)頁(yè)面,跳到第一或者第三個(gè)頁(yè)面),如果頁(yè)面向右翻動(dòng),大部分時(shí)間是和當(dāng)前頁(yè)面是一致的,只有最后才變成目標(biāo)頁(yè)面;如果向左翻動(dòng),position和目標(biāo)頁(yè)面是一致的。這和用手指拖動(dòng)頁(yè)面翻動(dòng)是基本一致的。
如果不是相鄰的情況,比如我從第一個(gè)頁(yè)面跳到第三個(gè)頁(yè)面,position先是0,然后逐步變成1,然后逐步變成2;我從第三個(gè)頁(yè)面跳到第一個(gè)頁(yè)面,position先是1,然后逐步變成0,并沒(méi)有出現(xiàn)為2的情況。
positionOffset是當(dāng)前頁(yè)面滑動(dòng)比例,如果頁(yè)面向右翻動(dòng),這個(gè)值不斷變大,最后在趨近1的情況后突變?yōu)?。如果頁(yè)面向左翻動(dòng),這個(gè)值不斷變小,最后變?yōu)?。
positionOffsetPixels是當(dāng)前頁(yè)面滑動(dòng)像素,變化情況和positionOffset一致。
3.onPageScrollStateChanged(int state):這個(gè)方法在手指操作屏幕的時(shí)候發(fā)生變化。有三個(gè)值:0(END),1(PRESS) , 2(UP) 。
當(dāng)用手指滑動(dòng)翻頁(yè)時(shí),手指按下去的時(shí)候會(huì)觸發(fā)這個(gè)方法,state值為1,手指抬起時(shí),如果發(fā)生了滑動(dòng)(即使很小),這個(gè)值會(huì)變?yōu)?,然后最后變?yōu)? 。總共執(zhí)行這個(gè)方法三次。一種特殊情況是手指按下去以后一點(diǎn)滑動(dòng)也沒(méi)有發(fā)生,這個(gè)時(shí)候只會(huì)調(diào)用這個(gè)方法兩次,state值分別是1,0 。
當(dāng)setCurrentItem翻頁(yè)時(shí),會(huì)執(zhí)行這個(gè)方法兩次,state值分別為2 , 0 。
三個(gè)方法的執(zhí)行順序?yàn)椋河檬种竿蟿?dòng)翻頁(yè)時(shí),最先執(zhí)行一遍onPageScrollStateChanged(1),然后不斷執(zhí)行onPageScrolled,放手指的時(shí)候,直接立即執(zhí)行一次onPageScrollStateChanged(2),然后立即執(zhí)行一次onPageSelected,然后再不斷執(zhí)行onPageScrollStateChanged,最后執(zhí)行一次onPageScrollStateChanged(0)。
其它的情況由這個(gè)可以推出來(lái),不再贅述。
推薦文章
2025-01-18
2024-11-28
2024-11-09
2024-10-25
2024-06-25
2024-01-04
2023-11-06
2023-10-30
2023-10-13
2023-10-10
穩(wěn)定
產(chǎn)品高可用性高并發(fā)貼心
項(xiàng)目群及時(shí)溝通專業(yè)
產(chǎn)品經(jīng)理1v1支持快速
MVP模式小步快跑承諾
我們選擇聲譽(yù)堅(jiān)持
10年專注高端品質(zhì)開發(fā)聯(lián)系我們
友情鏈接: