View的滑動
View的滑動實(shí)現(xiàn)基本有三種思路蓉驹,一種是通過ScrollTo和ScrollBy,一種是通過動畫給View添加平移效果滥朱,第三種是改變View的LayoutParams屬性來使得View重新布局。
scrollTo/scrollBy
使用這類兩個(gè)方法骡技,我們要知道m(xù)ScrollX和mScrollY這兩個(gè)變量柑土,他們指的View的內(nèi)容與View之間的偏移量。在滑動過程中mScrollX的值等于View左上緣和View內(nèi)容左上緣的距離蔓钟,mScrollY同理。View的邊緣指View的位置卵贱,由四個(gè)頂點(diǎn)決定滥沫。scrollTo和scrollBy只能改變View的內(nèi)容侣集。獲取這兩個(gè)值由getScrollX()和getScrollY()得到。
他們的單位為像素兰绣。當(dāng)View的邊緣在View的內(nèi)容的右邊時(shí)世分,mScrollX為正,即從右往左滑缀辩,反過來為負(fù)臭埋。上下滑動也是同理,從下往上滑為正臀玄。
比如上面這張圖瓢阴,mScrollX為正100。
scrollTo(int x,int y)表示移動到視圖的那個(gè)坐標(biāo)點(diǎn)健无。哪個(gè)視圖調(diào)用這個(gè)方法荣恐,那么這個(gè)視圖的(x,y)點(diǎn)就與父容器的左上角對齊
scrollBy(int dx, int dy) 表示在視圖的X、Y方向上各移動dx睬涧、dy距離
dx>0表示視圖(View或ViewGroup)的內(nèi)容從右向左滑動;反之,從左向右滑動
dy>0表示視圖(View或ViewGroup)的內(nèi)容從下向上滑動;反之旗唁,從上向下滑動
使用動畫
使用動畫是操作View的translationX和translationY屬性畦浓,也就是平移〖煲撸可以采用普通動畫讶请,也可以采用屬性動畫。若采用屬性動畫則需要兼容3.0以下的版本屎媳,需要采用開源動畫庫nineoldandroids夺溢,不過現(xiàn)在手機(jī)系統(tǒng)基本都是4.0以上。
要注意烛谊,View的平移只是對View的影像做操作风响,實(shí)際上View的位置不變,如果View具有點(diǎn)擊效果丹禀,那么只有點(diǎn)擊View原來的位置才有效状勤,平移后的位置并沒有效果。
使用LayoutParams屬性双泪。
當(dāng)我們需要把View的位置向右平移100像素持搜,那么只要設(shè)置marginLeft的值增加100px即可”好或者在view的左邊放置一個(gè)空View葫盼,寬度為0,改變空View的寬度村斟,也能把View擠到右邊贫导。
MarginLayoutParams params= (MarginLayoutParams ) btn.getLayoutParams();
params.width +=100;
params.leftMargin+=100;
btn.requestLayout();
View的彈性滑動
上面的滑動都是比較生硬的抛猫,我們需要的是一種漸進(jìn)性的滑動。彈性滑動實(shí)現(xiàn)的方式也是有多種脱盲,但他們的思想都一樣邑滨,就是將一次完整的滑動分解為若干次小的滑動并在一段時(shí)間內(nèi)完成。
使用Scroller
下面是Scroller的典型用法
scroller = new Scroller(context);
private void smoothScrollTo(int destX,int destY) {
int scrollY=getScrollY();
int deltaY = destY-scrollY;
scroller.startScroll(0,scrollY,0,destY,1000);
invalidate();
}
@Override
public void computeScroll() {
if(scroller.computeScrollOffset()){
scrollTo(scroller.getCurrX(),scroller.getCurrY());
postInvalidate();
}
}
我們來了解一下Scroller的工作原理钱反,滑動的關(guān)鍵地方是invalidate()方法掖看。調(diào)用startScroll()只是傳遞相關(guān)參數(shù)。invalidate會導(dǎo)致View重繪面哥,在View的draw方法會去調(diào)用computeScroll方法哎壳,在computeScroll中進(jìn)行滑動,而postInvalidate又會二次重繪尚卫,這又導(dǎo)致computeScroll被調(diào)用归榕,循環(huán)下去,直到滑動結(jié)束吱涉。computeScrollOffset()方法會根據(jù)時(shí)間的流逝來計(jì)算當(dāng)前的scrollX和scrollY.返回值true表示滑動還未結(jié)束刹泄,false則是結(jié)束。
以上內(nèi)容大部分摘自《安卓開發(fā)藝術(shù)探索》怎爵,若想理解更仔細(xì)請閱讀原書特石。