scroller和事件分發總結

            一.scroller使用總結

            1.scrollerTo和scrollerBy

/**
 * scrollTo:移動view內部的內容,記住是內容,view本身沒有發生任何位置上的變化,移動的僅僅是裏面的內容。他的作用是讓裏面的內容相對於最初的位置滾動多少距離
 *          記住是相對於最初的位置,這也再次印證了他移動的僅僅是裏面的內容,本身位置沒變
 * scrollBy:也是移動view內部的內容,記住是內容,本身沒有任何變化,移動的僅僅是裏面的內容,所以如果想要某個內容移動,需要嵌套一個父view,然後操縱父view來
 *          達到移動的目的。他的作用是讓裏面的內容相對於當前的位置移動多少距離,記住是當前的位置,也就說如果連續執行就會連續運動,但是scrollto則只會運動一次
 * 備註:參數爲正數時表示向左移動,參數爲負數時表示向右移動
 */
          2.scroller使用總結

/**
 * scroller使用總結:
 * 1.創建scroller對象,可以創建時同時制定運動過程的插值器
 * 2.調用scroller.startScroll();方法,參數分別爲起始位置,終點座標,時長
 * 3.重寫computeScroll()方法,不停的進行強制重繪
 * 注意點:scroller只能在view當中使用,如果拋開這一點,scroller完全可以替代屬性動畫,他們兩個的思維方式是幾乎完全一樣的,
 * 當然在view中也可以使用scroller替代屬性動畫
 */
        下面是一個例子:(使用就是固定的)

public void changeState(boolean close) {
        mState = !close;
        mScroller = new Scroller(getContext(), new LinearInterpolator());
        if (close) {
            mScroller.startScroll(getScrollX(), 0, -mTvZhiDingWidth - mTvDeleteWidth, 0);
        } else {
            mScroller.startScroll(getScrollX(), 0, mTvZhiDingWidth + mTvDeleteWidth, 0);
        }
    }
    @Override
    public void computeScroll() {
        if (mScroller.computeScrollOffset()) {
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            postInvalidate();
        }
    }
       二.事件處理總結

       

    /**  參考資料:http://www.gcssloop.com/customview/dispatch-touchevent-theory
     * 是否分發事件,默認返回true,說明需要判斷子view是否需要消費此事件,但是如果子類沒有需要消費的就返回false,交給父類的ontouchevent去處理
     * @param ev
     * @return
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 是否打斷事件傳遞,dispatchTouchEvent方法調用後會進入此方法,判斷是否需要攔截事件,如果攔截了就進入自己的onTouchEvent處理事件,
     * 當然如果onTouchEvent也返回false則事件又交給dispatchTouchEvent處理,返回父類處理;攔截事件默認是不攔截的,即交給子view去處理事件
     * 調用子view的dispatchTouchEvent方法,如果子view中沒有消費掉此事件則進入自己的onTouchEvent事件進行處理
     * @param ev
     * @return
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev);
    }

    /**
     * 觸摸事件,如果返回true則表示事件自己處理掉了,如果返回false則表示沒有處理掉,需要父類處理
     * @param event
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }

發佈了62 篇原創文章 · 獲贊 28 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章