滑動到底部或頂部響應的ScrollView實現

來源:互聯網
上載者:User

標籤:android   http   java   os   strong   io   

本文主要介紹實現ScrollView滑動到底部或頂部響應的兩種方式

 

兩種實現方式的主要不同點在於判斷滑動位置的地方,第一種方式在onScrollChanged函數中判斷, 第二種在OnTouchListener的onTouch中判斷。其他如是否滾動到邊緣的判斷、響應事件介面OnBorderListener、對外暴露的介面都一樣。

第一種方式代碼可見onScrollChanged BorderScrollView
第二種方式代碼可見OnTouchListener BorderScrollView

 

1、判斷是否已經滾動到頂部或底部,代碼如下:

  Java 
1234567891011 private void doOnBorderListener() {    if (contentView != null && contentView.getMeasuredHeight() <= getScrollY() + getHeight()) {        if (onBorderListener != null) {            onBorderListener.onBottom();        }    } else if (getScrollY() == 0) {        if (onBorderListener != null) {            onBorderListener.onTop();        }    }}

滾動到頂部判斷:getScrollY() == 0
滾動到底部判斷

 
12 View contentView = getChildAt(0);contentView.getMeasuredHeight() <= getScrollY() + getHeight();

其中getChildAt表示得到ScrollView的child View,因為ScrollView只允許一個child view,所以contentView.getMeasuredHeight()表示得到子View的高度, getScrollY()表示得到y軸的滾動距離,getHeight()為scrollView的高度。當getScrollY()達到最大時加上scrollView的高度就的就等於它內容的高度了啊~

 

2、定義到達頂部和底部響應事件介面OnBorderListener,包含onTop和onBottom函數

  Java 
1234567891011121314151617 /** * OnBorderListener, Called when scroll to top or bottom * * @author Trinea 2013-5-22 */public static interface OnBorderListener {     /**     * Called when scroll to bottom     */    public void onBottom();     /**     * Called when scroll to top     */    public void onTop();}

這個介面允許使用者自訂到達底部和頂部的響應事件

 

第一種方式: 在onScrollChanged函數中判斷,主要代碼如下:

  Java 
12345 @Overrideprotected void onScrollChanged(int x, int y, int oldx, int oldy) {    super.onScrollChanged(x, y, oldx, oldy);    doOnBorderListener();}

在ScrollView的onScrollChanged函數中判斷是否到達頂部和底部,並進行相應事件調用,onScrollChanged函數在ScrollView中內容開始滾動時出發被調用。

 

 

第二種方式: 在OnTouchListener的onTouch中判斷,主要代碼如下:

  Java 
12345678910111213 this.onBorderTouchListener = new OnTouchListener() {     @Override    public boolean onTouch(View v, MotionEvent event) {        switch (event.getAction()) {            case MotionEvent.ACTION_UP:                doOnBorderListener();                break;        }        return false;    } };

表示在touch結束後,手指拿起時執行doOnBorderListener,進行判斷和響應。

 

兩種方式的比較:
第一種方式精確度高,但doOnBorderListener可能執行多次,因為ScrollView滑動中,onScrollChanged總是在不停被調用,需要使用者自己做並發控制,也可以參考DropDownListView的寫法讓使用者在自訂Listener執行結束後手動調用onBottomComplete函數。

 

第二種方式不會造成doOnBorderListener多次執行,但卻可能一次都沒有調用。比如你快速滑動,還未到達底部手指已經鬆開,由於慣性滾動到底部,可能並不會執行doOnBorderListener。因為onTouch的ACTION_UP事件在手指鬆開已經接收到這時候卻還沒有到達底部。

兩種方式各有優劣,大家可酌情選擇。我要求準確響應,所以選擇了第一種,自己再做下控制確保不會多次執行。

轉自:http://www.trinea.cn/android/on-bottom-load-more-scrollview-impl/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.