<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                #### 3.3.1 使用Scroller Scroller的使用方法在3.1.4節中已經進行了介紹,下面我們來分析一下它的源碼,從而探究為什么它能實現View的彈性滑動。 Scroller scroller = new Scroller(mContext); // 緩慢滾動到指定位置 private void smoothScrollTo(int destX, int destY) { int scrollX = getScrollX(); int deltaX = destX - scrollX; // 1000ms內滑向destX,效果就是慢慢滑動 mScroller.startScroll(scrollX, 0, deltaX, 0, 1000); invalidate(); } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } } 上面是Scroller的典型的使用方法,這里先描述它的工作原理:當我們構造一個Scroller對象并且調用它的startScroll方法時,Scroller內部其實什么也沒做,它只是保存了我們傳遞的幾個參數,這幾個參數從startScroll的原型上就可以看出來,如下所示。 public void startScroll(int startX, int startY, int dx, int dy, int duration){ mMode = SCROLL_MODE; mFinished = false; mDuration = duration; mStartTime = AnimationUtils.currentAnimationTimeMillis(); mStartX = startX; mStartY = startY; mFinalX = startX + dx; mFinalY = startY + dy; mDeltaX = dx; mDeltaY = dy; mDurationReciprocal = 1.0f / (float) mDuration; } 這個方法的參數含義很清楚,startX和startY表示的是滑動的起點,dx和dy表示的是要滑動的距離,而duration表示的是滑動時間,即整個滑動過程完成所需要的時間,注意這里的滑動是指View內容的滑動而非View本身位置的改變。可以看到,僅僅調用startScroll方法是無法讓View滑動的,因為它內部并沒有做滑動相關的事,那么Scroller到底是如何讓View彈性滑動的呢?答案就是startScroll方法下面的invalidate方法,雖然有點不可思議,但是的確是這樣的。invalidate方法會導致View重繪,在View的draw方法中又會去調用computeScroll方法,computeScroll方法在View中是一個空實現,因此需要我們自己去實現,上面的代碼已經實現了computeScroll方法。正是因為這個computeScroll方法,View才能實現彈性滑動。這看起來還是很抽象,其實這樣的:當View重繪后會在draw方法中調用computeScroll,而computeScroll又會去向Scroller獲取當前的scrollX和scrollY;然后通過scrollTo方法實現滑動;接著又調用postInvalidate方法來進行第二次重繪,這一次重繪的過程和第一次重繪一樣,還是會導致computeScroll方法被調用;然后繼續向Scroller獲取當前的scrollX和scrollY,并通過scrollTo方法滑動到新的位置,如此反復,直到整個滑動過程結束。 我們再看一下Scroller的computeScrollOffset方法的實現,如下所示。 /** * Call this when you want to know the new location. If it returns true, * the animation is not yet finished. */ public boolean computeScrollOffset() { ... int timePassed = (int)(AnimationUtils.currentAnimationTimeMillis() - mStartTime); if (timePassed < mDuration) { switch (mMode) { case SCROLL_MODE: final float x = mInterpolator.getInterpolation(timePassed * mDurationReciprocal); mCurrX = mStartX + Math.round(x * mDeltaX); mCurrY = mStartY + Math.round(x * mDeltaY); break; ... } } return true; } 是不是突然就明白了?這個方法會根據時間的流逝來計算出當前的scrollX和scrollY的值。計算方法也很簡單,大意就是根據時間流逝的百分比來算出scrollX和scrollY改變的百分比并計算出當前的值,這個過程類似于動畫中的插值器的概念,這里我們先不去深究這個具體過程。這個方法的返回值也很重要,它返回true表示滑動還未結束,false則表示滑動已經結束,因此當這個方法返回true時,我們要繼續進行View的滑動。 通過上面的分析,我們應該明白Scroller的工作原理了,這里做一下概括:Scroller本身并不能實現View的滑動,它需要配合View的computeScroll方法才能完成彈性滑動的效果,它不斷地讓View重繪,而每一次重繪距滑動起始時間會有一個時間間隔,通過這個時間間隔Scroller就可以得出View當前的滑動位置,知道了滑動位置就可以通過scrollTo方法來完成View的滑動。就這樣,View的每一次重繪都會導致View進行小幅度的滑動,而多次的小幅度滑動就組成了彈性滑動,這就是Scroller的工作機制。由此可見,Scroller的設計思想是多么值得稱贊,整個過程中它對View沒有絲毫的引用,甚至在它內部連計時器都沒有。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看