一盐股、前言
這篇文章主要是講述Scroller的基礎(chǔ)使用钱豁。了解過(guò)的老鳥(niǎo)可以出門左轉(zhuǎn),不必浪費(fèi)時(shí)間啦~
先介紹下scrollTo()
和 scrollBy()
倆個(gè)方法疯汁。
View
的scrollTo()
和scrollBy()
方法
這倆方法有毛子用牲尺?通俗點(diǎn)就是讓view給老子滾…只是滾的姿態(tài)不同。
scrollTo(x,y)
與scrollBy(x,y)
倆個(gè)方法滾的姿態(tài)有何不同呢?
可以這么分析:
scrollTo()
——>讓View從最初的地方到指定的地方去谤碳,也就是終點(diǎn)固定了的溃卡。
scrollBy()
——>讓View從現(xiàn)在的地方到指定的地方去,也就是永遠(yuǎn)沒(méi)有盡頭蜒简,終點(diǎn)是下一個(gè)起點(diǎn)瘸羡。
如果,你要聽(tīng)俗點(diǎn)的話:
scrollTo()
——>給老子滾搓茬,他就滾過(guò)去犹赖,下次滾,他會(huì)回來(lái)從頭滾卷仑。
scrollBy()
——>給老子滾峻村,他就滾,下次滾锡凝,他蠢起不會(huì)回頭粘昨,就一路滾到底。
scrollTo()
和scrollBy()
就說(shuō)到這了窜锯。(不懂就私信张肾,咱私聊~)
注意:
- 倆個(gè)方法的參數(shù),是偏移量而不是坐標(biāo)衬浑“坪疲‘偏移量’是什么?不知道是不是就我一個(gè)腦殘第一次看到這三個(gè)字懵逼了半天工秩,就是移動(dòng)的量尸饺。
- 然而這倆個(gè)方法的滾,并不是真正的滾助币,因?yàn)榭床坏綕L的過(guò)程浪听,所以就有了Scroller這個(gè)類,可以讓他們滾的自然點(diǎn)平滑點(diǎn)
- 有一篇正兒八經(jīng)介紹這倆個(gè)類的博客: scrollTo 和 scrollBy 方法使用說(shuō)明
二眉菱、正文
聽(tīng)說(shuō)不上圖的技術(shù)文都是耍流氓:
首先按我的理解介紹下Scroller類.
控制一個(gè)點(diǎn)的坐標(biāo)在一定時(shí)間內(nèi)進(jìn)行偏移迹栓。
為什么我不說(shuō)是一個(gè)view,因?yàn)樗鼪](méi)明確表明得用在view身上呀俭缓。
也就是說(shuō):這個(gè)它只是控制數(shù)值的變化克伊。
一般情況下,好像確實(shí)沒(méi)毛線用华坦。不過(guò)一般在
view
與viewGroup
里面用的比較多愿吹。
因?yàn)椋?code>view的computeScroll()
方法會(huì)在ondraw()
的時(shí)候調(diào)用。所以惜姐,我們?cè)陂_(kāi)始Scroller的 數(shù)值變化時(shí)調(diào)用view
的ondraw()
來(lái)調(diào)用computeSroll()
犁跪。而computeScroll()
干嘛用的椿息?給我們繼續(xù)刷新界面用的……那不是死循環(huán)了?所以Scroller
這邊有一個(gè)很重要的方法坷衍。
Scroller.computeScrollOffset()
-->:判斷Scroller的數(shù)值是否還在變化中寝优,true為變化中,false為變化完成枫耳。
注意:這邊已經(jīng)提到了乏矾,Scroller是操控?cái)?shù)值得,也就是你壓根看不到view滾起來(lái)嘉涌。那怎么辦妻熊?好的,就是上面提到的ScrollTo()仑最、ScrollBy()那倆方法了扔役。如果他在變化中,我們將通過(guò)這倆個(gè)方法讓view移動(dòng)起來(lái)警医。
- 綜上所述:
這邊需要知道的幾個(gè)Scroller的方法亿胸。
Scroller.computeScrollOffset()
-->:判斷Scroller的數(shù)值是否還在變化中,true為變化中预皇,false為變化完成侈玄。Scroller.startScroll (int startX, int startY, int dx, int dy)
-->開(kāi)始數(shù)值變化展父,前倆個(gè)參數(shù)為起始的X橘霎、Y值,后面?zhèn)z個(gè)是對(duì)應(yīng)的偏移量(偏移量:左上為正,右下為負(fù)裆甩。默認(rèn)偏移時(shí)間為250毫秒鲁豪,可以自己加個(gè)時(shí)間參數(shù)潘悼。)Scroller.getCurrX()
-->:得到當(dāng)前變化的X。也就是第一個(gè)參數(shù)爬橡。Scroller.getCurrY()
-->:得到當(dāng)前變化的Y治唤。就第二個(gè)參數(shù)。
然后糙申,等等宾添。嘿嘿……
構(gòu)造函數(shù)
總共三個(gè)構(gòu)造函數(shù):
一個(gè)參數(shù)的傳遞的是上下文,倆個(gè)參數(shù)的多了個(gè)動(dòng)畫(huà)插入器柜裸,可以插效果缕陕。第三個(gè)參數(shù)是一個(gè)布爾類型的(英文名叫調(diào)速輪,并不知道干嘛的疙挺,誰(shuí)知道麻煩告知下榄檬,謝啦~~)。所以這邊貼點(diǎn)動(dòng)畫(huà)效果,摘錄自:大神講解的Scroller
AccelerateDecelerateInterpolator 動(dòng)畫(huà)效果:開(kāi)始和結(jié)束都是緩慢的衔统,通過(guò)中間時(shí)候加速
AccelerateInterpolator, 動(dòng)畫(huà)效果:開(kāi)始緩慢,之后加速
AnticipateInterpolator, 動(dòng)畫(huà)效果:開(kāi)始后退,然后前進(jìn)
AnticipateOvershootInterpolator, 動(dòng)畫(huà)效果:開(kāi)始后退锦爵,之后前進(jìn)并超過(guò)終點(diǎn)位置舱殿,最終退回到終點(diǎn)
BounceInterpolator, 動(dòng)畫(huà)效果:慢慢反彈到,彈性衰減到結(jié)束
CycleInterpolator, 動(dòng)畫(huà)效果:重復(fù)循環(huán)動(dòng)畫(huà)险掀,速度變化遵循正弦定律
DecelerateInterpolator, 動(dòng)畫(huà)效果:剛開(kāi)始快速沪袭,之后減速
LinearInterpolator, 動(dòng)畫(huà)效果:不斷的變化
OvershootInterpolator 動(dòng)畫(huà)效果:像前超越最終點(diǎn)然后回來(lái)
三、代碼
- 在自定義view里面聲明
Scroller
樟氢。初始化方法里面冈绊。
//可以模擬一個(gè)彈彈彈彈奏魚(yú)尾紋的效果
scroller = new Scroller(getContext(),new BounceInterpolator(),false);
- 調(diào)用Scroller的開(kāi)始滾動(dòng)計(jì)算,我是在點(diǎn)擊時(shí)調(diào)用了下埠啃。
//開(kāi)始滾動(dòng)的方法
private void startScroll(){
//這里設(shè)置從0,0 開(kāi)始死宣,x、y1000毫秒內(nèi)分別向左和上偏移200個(gè)單位
//可以自己動(dòng)態(tài)控制四個(gè)值
scroller.startScroll(0,0,200,200,1000);
//記得刷新界面
invalidate();
}
- 最后碴开!
computeScroll()
里面刷新界面顯示滾動(dòng)效果
@Override
public void computeScroll() {
//為true代表還在滾
if (scroller.computeScrollOffset()){
//讓view滾到當(dāng)前計(jì)算的位置毅该,就是讓他滾哪就滾哪。
//注意用SrollTo潦牛,前面講解過(guò)啦~ SrollBy是疊加
scrollTo(scroller.getCurrX(),scroller.getCurrY());
postInvalidate();//重繪
}else {
//動(dòng)畫(huà)執(zhí)行完畢讓他回去
scrollTo(0,0);
}
super.computeScroll();
}
好的小功告成還是蠻簡(jiǎn)單的嘛眶掌。
結(jié)語(yǔ)
本渣希望能幫助到有需要的朋友~也希望能共同進(jìn)步!