安卓view滑動控件及方法scrollBy,scrollTo的使用

在Android View視圖是沒有邊界的,Canvas是沒有邊界的,只不過我們通過繪製特定的View時對
Canvas對象進行了一定的操作,例如 : translate(平移)、clipRect(剪切)等,以便達到我們的對該Canvas對象繪製的要求 ,我們可以將這種無邊界的視圖稱爲“視圖座標”—–它不受物理屏幕限制。通常我們所理解的一個Layout佈局文件只是該視
圖的顯示區域,超過了這個顯示區域將不能顯示到父視圖的區域中 ,對應的,我們可以將這種有邊界的視圖稱爲“佈局座標” —— 父視圖給子視圖分配的佈局(layout)大小。
mScrollX: 該視圖內容相當於視圖起始座標的偏移量, X軸方向
mScrollY: 該視圖內容相當於視圖起始座標的偏移量, Y軸方向
mScrollX 與 mScrollY 代表我們當前偏移的位置
oldX與oldY代表之前的偏移位置

方法:

scrollBy():移動組件滑動位置,會導致onScrollChanged()方法被調用,和視圖會被拋棄。在當前視圖內容繼續偏移(x , y)個單位,顯示(可視)區域也跟着偏移(x,y)個單位。
scrollTo():設置組件滑動位置,同上。在當前視圖內容偏移至(x , y)座標處,即顯示(可視)區域位於(x , y)座標處。
調用View的scrollTo()和scrollBy()是用於滑動View中的內容,而不是把某個View的位置進行改變。

例子:

/*這個方法是發生在左右滑動組件,設置其左右邊界,使之到達邊界時不超過邊界,邊界值視具體情況而定*/
private void handleMove(MotionEvent ev){
        final int historySize = ev.getHistorySize();
        final int pointerCount = ev.getPointerCount();

        float tx = 0,ty = 0;
        for(int h=0;h<historySize;h++){
            for(int p=0;p<pointerCount;p++){
                tx = ev.getHistoricalX(p, h);
                ty = ev.getHistoricalY(p, h);
                /*使用getScrollX獲得當前滾動組件左邊的座標,小於0則超出了左邊界,大於?值則超出了右邊界/
                if(this.getScrollX() < 0) {
                    scrollTo(0, 0);
                    continue;
                }else if(this.getScrollX() > this.getWidth()/3*2) {
                    scrollTo(this.getWidth()/3*2,0);
                    continue;
                }

                this.scrollBy((int) (x-tx),0);
                x = tx;
                y = ty;
            }
        }

        for(int p = 0;p<pointerCount;p++){
            tx = ev.getX(p);
            ty = ev.getY(p);

            if(this.getScrollX() < 0) {
                scrollTo(0,0);
                continue;
            } else if(this.getScrollX() > this.getWidth()) {
                scrollTo(this.getWidth(),0);
                continue;
            }

            this.scrollBy((int)(x-tx),0);
            x = tx;
            y = ty;

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