Android開發藝術探索知識回顧——第3章 View的事件體系:2、View的滑動

 

3.2 View的滑動

3.1節介紹了 View 的一些基礎知識和概念,本節開始介紹很重要的一個內容:View的滑動。在Android設備上,滑動幾乎是應用的標配,不管是下拉刷新還是 SlidingMenu,它們的基礎都是滑動。從另外一方面來說,Android手機由於屏幕比較小,爲了給用戶呈現更多的內容,就需要使用滑動來隱藏和顯示一些內容。

基於上述兩點,可以知道,滑動在 Android開發中具有很重要的作用,不管一些滑動效果多麼絢麗,歸根結底,它們都是由不同的滑動外加一些特效所組成的。因此,掌握滑動的方法是實現絢麗的自定義控件的基礎

通過三種方式可以實現View的滑動:

第一種是通過 View 本身提供的 scrollTo/scrollBy 方法來實現滑動;

第二種是通過動畫給 View 施加平移效果來實現滑動;

第三種是通過改變 View 的 LayoutParams 使得 View 重新佈局從而實現滑動。

從目前來看,常見的滑動方式就這麼三種,下面一一進行分析。

 

3.2.1 使用 scrollTo/scrollBy

爲了實現 View 的滑動,View 提供了專門的方法來實現這個功能,那就是 scrollTo 和 scrollBy,我們先來看看這兩個方法的實現,如下所示。


    /**
     * Set the scrolled position of your view. This will cause a call to
     * {@link #onScrollChanged(int, int, int, int)} and the view will be
     * invalidated.
     * @param x the x position to scroll to
     * @param y the y position to scroll to
     */
    public void scrollTo(int x, int y) {
        if (mScrollX != x || mScrollY != y) {
            int oldX = mScrollX;
            int oldY = mScrollY;
            mScrollX = x;
            mScrollY = y;
            invalidateParentCaches();
            onScrollChanged(mScrollX, mScrollY, oldX, oldY);
            if (!awakenScrollBars()) {
                postInvalidateOnAnimation();
            }
        }
    }

    /**
     * Move the scrolled position of your view. This will cause a call to
     * {@link #onScrollChanged(int, int, int, int)} and the view will be
     * invalidated.
     * @param x the amount of pixels to scroll by horizontally
     * @param y the amount of pixels to scroll by vertically
     */
    public void scrollBy(int x, int y) {
        scrollTo(mScrollX + x, mScrollY + y);
    }

從上面的源碼可以看出,scrollBy 實際上也是調用了 scrollTo 方法,它實現了基於當前位置的相對滑動,而 scrollTo 則實現了基於所傳遞參數的絕對滑動,這個不難理解。利用 scrollTo 和 scrollBy 來實現 View的 滑動,這不是一件困難的事,但是我們要明白滑動過程中 View內部的兩個屬性 mScrollX 和 mScrollY 的改變規則,這兩個屬性可以通過 getScrollX getScrollY 方法分別得到。

這裏先簡要概況一下:在滑動過程中,mScrollX 的值總是等於 View 左邊緣和 View 內容左邊緣在水平方向的距離,而 mScrollY 的值總是等於 View 上邊緣和 View 內容上邊緣在豎直方向的距離。View 邊緣是指 View 的位置,由四個頂點組成,而 View 內容邊緣是指 View 中的內容的邊緣,scrollTo 和 scrollBy 只能改變 View 內容的位置而不能改變 View 在佈局中的位置。

mScrollX 和 mScrollY 的單位爲像素,並且當 View 左邊緣在 View 內容左邊緣的右邊時,mScrollX爲正值,反之爲負值;當 View 上邊緣在 View 內容上邊緣的下邊時,mScrollY爲正值,反之爲負值。換句話說,如果從左向右滑動,那麼 mScrollX 爲負值,反之爲正值;如果從上往下滑動,那麼 mScrollY 爲負值,反之爲正值。

爲了更好地理解這個問題,下面舉個例子,如圖3-3所示。在圖中假設水平和豎直方向的滑動距離都爲 100 像素,針對圖中各種滑動情況,都給出了對應的 mScrollX 和 mScrollY 的值。根據上面的分析,可以知道,使用 scrollTo 和 scrollBy 來實現 View 的滑動,只能將 View 的內容進行移動,並不能將View本身進行移動,也就是說,不管怎麼滑動,也不可能將當前 View 滑動到附近 View 所在的區域,這個需要仔細體會一下。

3-3 mScrollX 和 mScrollY 的變換規律示意

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章