一莱革、ViewPager的簡(jiǎn)單使用
1.設(shè)置數(shù)據(jù):
具體頁(yè)面可以使用adapter來實(shí)現(xiàn),刷新數(shù)據(jù)使用adapter的notifyDataSetChanged,無限滑動(dòng)可以通過改變adapter的getCount方法和自己的setCurrentItem來實(shí)現(xiàn)厕氨。
2.常用基本方法:
ViewPager.setOffscreenPageLimit(3); // viewPager的緩存頁(yè)數(shù)
ViewPager.setPageMargin(CommonUtils.dip2px(activity, 15)); // viewPager頁(yè)與頁(yè)之前的間距
ViewPager.setPageTransformer(false, new AlphaTransformer()); // viewPager 滑動(dòng)過程中動(dòng)效的設(shè)置
3.自定義:
通過自定義可以實(shí)現(xiàn)是否可以滑動(dòng)換頁(yè)
是否需要滑動(dòng)效果
等等
最簡(jiǎn)單的指示器代碼如下圖
具體效果:
有多少個(gè)頁(yè)面就有多少個(gè)指示器圖標(biāo),可以是圖片也可以自己通過shape畫汹粤,一般都是灰白圓點(diǎn)命斧。
主要通過onPageSelected變化具體點(diǎn)位。
以前用setOnPageChangeListener
現(xiàn)在被addOnPageChangeListener替換
二嘱兼、OnPageChangeListener
1.onPageSelected(int position):
這個(gè)方法有一個(gè)參數(shù)position国葬,代表哪個(gè)頁(yè)面被選中。
當(dāng)用手指滑動(dòng)翻頁(yè)的時(shí)候芹壕,如果翻動(dòng)成功了(滑動(dòng)的距離夠長(zhǎng))汇四,手指抬起來就會(huì)執(zhí)行這個(gè)方法,position就是當(dāng)前滑動(dòng)到的頁(yè)面踢涌。
這個(gè)方法一般被用來獲取滑動(dòng)過后當(dāng)前頁(yè)通孽。
2.onPageScrolled(int position,float positionOffset, int positionOffsetPixels):
這個(gè)方法會(huì)在屏幕滾動(dòng)過程中不斷被調(diào)用。
有三個(gè)參數(shù)睁壁,第一個(gè)position
第二個(gè)positionOffset是當(dāng)前頁(yè)面滑動(dòng)比例背苦,如果頁(yè)面向右翻動(dòng)互捌,這個(gè)值不斷變大,最后在趨近1的情況后突變?yōu)?行剂。如果頁(yè)面向左翻動(dòng)秕噪,這個(gè)值不斷變小,最后變?yōu)?厚宰。
第三個(gè)positionOffsetPixels是當(dāng)前頁(yè)面滑動(dòng)像素腌巾,變化情況和positionOffset一致。
我理解的position 就是間隔與位置A的關(guān)系固阁,position的值取至位置A同位置或位置A左邊的間隔值壤躲,如上圖此時(shí)position為1,當(dāng)item左滑過程中备燃,位置A左邊是間隔1碉克,所有返回的值一直是1,若右滑并齐,位置A左邊的就是間隔0漏麦,那返回值就是0,當(dāng)左滑停止時(shí)况褪,間隔2與位置A重疊撕贞,返回值就變成2了,同理右滑停止時(shí)就是0测垛。
下圖是setCurrentItem到最后一頁(yè)的日志捏膨。
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)也沒有發(fā)生,這個(gè)時(shí)候只會(huì)調(diào)用這個(gè)方法兩次袱蜡,state值分別是1,0 丝蹭。
當(dāng)setCurrentItem翻頁(yè)時(shí),會(huì)執(zhí)行這個(gè)方法兩次戒劫,state值分別為2 , 0 半夷。
舉個(gè)’栗子’:以我本次UI為例,onPageScrolled方法處理滑動(dòng)過程中迅细,小點(diǎn)點(diǎn)大小變化巫橄,onPageScrollStateChanged被調(diào)用后,清空onPageScrolled中判斷的舊值茵典,onPageSelected被調(diào)用后設(shè)置顏色變化和頁(yè)面具體邏輯湘换。
此方法適合Item外的變化,Item的變化可以用setPageTransformer统阿。
顏色也可以變化彩倚,因?yàn)轭伾a是6個(gè)16進(jìn)制數(shù),可以通過倆個(gè)數(shù)的差值與position計(jì)算扶平。
三帆离、滑動(dòng)動(dòng)效
ViewPager.setPageTransformer(false, new AlphaTransformer());
第一個(gè)參數(shù)boolean型 item層級(jí)方向
通過自定義 Transformer 可以實(shí)現(xiàn)自己想要的動(dòng)效
下圖是一個(gè)跟隨滑動(dòng)改變透明度的代碼
transformPage
倆個(gè)參數(shù) View page ,float position
Page就是Item對(duì)應(yīng)的view
Position就是當(dāng)前頁(yè)滑動(dòng)位置
下圖是當(dāng)前位item左滑的全部過程
如果你想只有一頁(yè)的動(dòng)效你只需要找
-1 < Position < 0
這個(gè)區(qū)間的item就可以了
如果是多頁(yè)的動(dòng)效结澄,你需要根據(jù)Position 大小去做對(duì)應(yīng)的操作
你可以在這個(gè)過程中做你任何想做的事哥谷,例如:
透明度
setAlpha 百分比
縮放
setPivotX setPivotY 設(shè)置縮放中心點(diǎn)位置像素
setScaleX setScaleY 具體縮放值百分比
位移
setTranslationX setTranslationY 像素
旋轉(zhuǎn)
setPivotX setPivotY 設(shè)置旋轉(zhuǎn)中心點(diǎn)位置像素
setRotationX setRotationY setRotation 繞XYZ旋轉(zhuǎn) 參數(shù)是旋轉(zhuǎn)度數(shù)
如果你想根據(jù)滑動(dòng)狀態(tài)實(shí)現(xiàn)item內(nèi)部某個(gè)控件的動(dòng)效,可以通過findViewById 可以找到對(duì)應(yīng)控件進(jìn)行對(duì)應(yīng)動(dòng)效麻献,你可以為所欲為们妥。
有些動(dòng)畫或布局可能超過父類你需要下面這個(gè)屬性
android:clipChildren 父類屬性 clipChild用來定義他的子控件是否要在他應(yīng)有的邊界內(nèi)進(jìn)行繪制。
一些我寫過的效果
Viewpager缺點(diǎn):
缺點(diǎn):Viewpager adapter 生成itemUI后勉吻,用notify方法只能刷新數(shù)據(jù)监婶,不會(huì)刷新UI,只有當(dāng)UI被銷毀后齿桃,重新生成才會(huì)生效惑惶,還有一種方法getItemPosition能刷新,但是也有缺點(diǎn)源譬,就是每次都會(huì)重新創(chuàng)建Item集惋。
ViewPager一次只切換一頁(yè)
ViewPager層級(jí)是固定的只能一個(gè)方向復(fù)蓋下去,要么頭層級(jí)最高踩娘,要么尾層級(jí)最高
RecyclerView + SnapHelper實(shí)現(xiàn)類似ViewPager效果
https://www.reibang.com/p/ef3a3b8d0a77
RecyclerView 可以切換多頁(yè)也可以切換一頁(yè)
RecyclerView 實(shí)現(xiàn)后 層級(jí)可以實(shí)現(xiàn)中間最高
RecyclerView 如果不自定義刮刑,是快速滑動(dòng)效果
RecyclerView 可以實(shí)現(xiàn)簡(jiǎn)單ViewPager效果 和 比ViewPager效果更好的效果,但是如果UI上明顯是ViewPager的效果 想用RecyclerView 完全復(fù)制就不如直接用ViewPager了养渴。
我為什么喜歡自己寫UI效果:
- 很難找到完全一樣效果的開源代碼雷绢,找個(gè)類似的然后花費(fèi)時(shí)間去讀懂別人代碼后再加工時(shí)間成本會(huì)更高。
- 一般開源代碼理卑,都會(huì)給你很多種效果供選擇翘紊,代碼量會(huì)很大,層級(jí)和架構(gòu)會(huì)比較復(fù)雜藐唠,也不便于你再加工帆疟。
- 你沒辦法讓UI設(shè)計(jì)師像你妥協(xié)鹉究,有時(shí)候再加工后才發(fā)現(xiàn)差一丟丟,這一丟丟很難再弄出來踪宠,你基本算是白干了自赔。