Scroller相關(guān)

scrollTo/scrollBy

  • 這兩個方法都是View的內(nèi)部方法
  • scrollTo和scrollBy只能改變View的內(nèi)容而不能改變View在布局中的位置。
  • 移動方向與笛卡爾坐標(biāo)軸左右上下是相反的
  • 在滑動過程中,View內(nèi)部的兩個屬性mscrollX和mscrollY都可以通過getScrollX和getScrollY方法獲得温数,mscrollX就是View左邊緣和View內(nèi)容左邊緣在水平方向的距離俏蛮。同理,mscrollY就是View上邊緣和View內(nèi)容的上邊緣的豎直方向的距離

Scroller

  • Scroller就是一個輔助類乒躺, 用來幫助進(jìn)行彈性滑動琅束。具體使用方法如下:
//在需要改動的view中
Scroller scroller = new Scroller(mContext);

//緩慢滾動到指定位置
private void smoothScrollTo(int destX, int destY){
      int scrollX = getScrollX();       //獲取當(dāng)前的mscrollX
      int scrolloY = getScrollY();     //獲取當(dāng)前的mscrollY
      int deltaX = destX - scrollX;
      int deltaY = destY - scrollY;
      mScroller.startScroll(scrollX, scrollY , deltaX, deltaY,1000);
      invalidate();
}


@override
public void computeScroll(){
      if ( mScroller.computeScrolljOffset()){
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            postInvalidate();
      }
}

上面的代碼就是如何在自定義的View中添加彈性滑動的效果扭屁。在自定義的View初始化時(shí),定義一個Scroller涩禀,然后自己添加一個private void smoothScrollTo()這樣一個私有方法料滥,用來被調(diào)用來執(zhí)行滑動效果的。public void computeScroll()方法在view中本是一個空實(shí)現(xiàn)的方法艾船,這個方法在view重繪時(shí)葵腹,draw方法中會被調(diào)用。那上面的代碼整個邏輯流程是什么呢丽声?讓我們繼續(xù)往下看。

  • Scroller的源碼學(xué)習(xí)
    smoothScrollTo(int destX, int destY)方法中觉义,整個邏輯流程如下:
  1. 我們首先利用view的getScrollX方法和getScrollY方法獲取到現(xiàn)在view與其內(nèi)容的偏移距離雁社,
  2. 接著根據(jù)目標(biāo)偏移距離和當(dāng)前偏移距離的差值,得到這次目前需要進(jìn)行得分位移
  3. 執(zhí)行mScroller.startScroll()方法晒骇,輸入?yún)?shù)是當(dāng)前X霉撵,Y方向的偏移距離,目標(biāo)的偏移距離洪囤,位移時(shí)間徒坡。下面介紹下mScroller.startScroll()方法的源碼。主要功能是保存?zhèn)鬟f的幾個參數(shù)瘤缩。
public void startScroll(int startX, int startY,int dx,int dy,int duration){
     mMode = SCROLL_MODE;
     mFinished = false;
     mDurarion = duration;
     mStartTime = AnimationUtilesd.currentAnimationTimeMilllis();
     mStartX = startX;
     mStartY = startY;
     mFinalX = startX + dx;
     mFinalY = startY  + dy;
     mDeltaX = dx;
     mDeltaY = dy;
     mDurationReciprocal = 1.0f /(float) mDuration; 
}
  1. 調(diào)用invalidate()會導(dǎo)致該View重繪喇完,View在draw()方法中會調(diào)用computeScroll()方法。
  2. computeScroll()方法剥啤,先調(diào)用mScroller.computeScrollOffset()方法锦溪,并判斷其返回值不脯。該方法的主要功能就是根據(jù)開始的坐標(biāo)位移,目的坐標(biāo)位移刻诊,當(dāng)前的時(shí)間防楷,總時(shí)間來確定此時(shí)此刻的位移X Y應(yīng)該是多少,并賦給mCurrX和mCurrY则涯。
    public boolean computeScrollOffset(){
          ...
          int timePassed = (int) (AnimationUtils.currentAnimationTimeMills() - mStartTime);
          
          if (timePassed < mDuration) {
                switch(mMode) {
                case SCROLL_MODE:
                      final float x = mInterpolartor.getInterpolation(timePassed * mDurationReciprocal);
                      mCurrX = mStartX + Math.round(x * mDeltaX);
                      mCurrY = mStartY + Math.round(x * mDeltaY);
                      break;
                      ......
                }
          }
          return true;         
    }
    
  3. computeScrollOffset()執(zhí)行完后复局,在computeScroll方法中,使用scrollTo方法位移到剛剛計(jì)算出的mCurrX粟判,mCurrY的位置上亿昏,然后調(diào)用postInvalidate()方法,再次要求重繪浮入,再次調(diào)用draw方法龙优,從而再次執(zhí)行computeScroll( )方法讓,從而能夠繪制出不同時(shí)間在不同位置出現(xiàn)的移動畫面事秀。
    scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
    postInvalidate();
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末彤断,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子易迹,更是在濱河造成了極大的恐慌宰衙,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睹欲,死亡現(xiàn)場離奇詭異供炼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窘疮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門袋哼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闸衫,你說我怎么就攤上這事涛贯。” “怎么了蔚出?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵弟翘,是天一觀的道長。 經(jīng)常有香客問我骄酗,道長稀余,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任趋翻,我火速辦了婚禮睛琳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己掸掏,他們只是感情好茁影,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丧凤,像睡著了一般募闲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上愿待,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天浩螺,我揣著相機(jī)與錄音,去河邊找鬼仍侥。 笑死要出,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的农渊。 我是一名探鬼主播患蹂,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砸紊!你這毒婦竟也來了传于?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤醉顽,失蹤者是張志新(化名)和其女友劉穎沼溜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體游添,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡系草,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唆涝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片找都。...
    茶點(diǎn)故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖廊酣,靈堂內(nèi)的尸體忽然破棺而出能耻,到底是詐尸還是另有隱情,我是刑警寧澤啰扛,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布嚎京,位于F島的核電站嗡贺,受9級特大地震影響隐解,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诫睬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一煞茫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦续徽、人聲如沸蚓曼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纫版。三九已至,卻和暖如春客情,著一層夾襖步出監(jiān)牢的瞬間其弊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工膀斋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梭伐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓仰担,卻偏偏與公主長得像糊识,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子摔蓝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 內(nèi)容是博主照著書敲出來的赂苗,博主碼字挺辛苦的,轉(zhuǎn)載請注明出處项鬼,后序內(nèi)容陸續(xù)會碼出哑梳。 當(dāng)了解了Android坐標(biāo)系和觸...
    Blankj閱讀 6,634評論 3 61
  • 一、Android開發(fā)初體驗(yàn) 二绘盟、Android與MVC設(shè)計(jì)模式模型對象存儲著應(yīng)用的數(shù)據(jù)和業(yè)務(wù)邏輯鸠真。模型類通常用來...
    為夢想戰(zhàn)斗閱讀 881評論 0 3
  • 什么是View View 是 Android 中所有控件的基類。 View的位置參數(shù) View 的位置由它的四個頂...
    acc8226閱讀 1,156評論 0 7
  • 預(yù)備知識 Android屏幕區(qū)域劃分我們先看一副圖來了解一下Android屏幕的區(qū)域劃分龄毡,如下:Android屏幕...
    小蕓論閱讀 8,947評論 6 44
  • 你身影如飛天驀然躍出時(shí)光的水面仰望吠卷,你如皓月臨空凝眸,你如星辰初綻你的色澤滋潤我目光如玉你的弧度撥動我心緒如弦聆聽...
    伊甸隕石閱讀 278評論 0 1