閱讀703 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Android 關於 OnScrollListener 事件順序次數的簡要分析

在 Android 的 OnScrollListener 整個事件我主要分析下他的執行順序:

實現滾動事件的監聽接口


new AbsListView.OnScrollListener(){
    @Override
    public void onScrollStateChanged(AbsListView absListView, int scrollState)
    {
        switch (scrollState) {
            case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                // 手指觸屏拉動準備滾動,隻觸發一次        順序: 2
                break;
            case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
                // 持續滾動開始,隻觸發一次                順序: 4
                break;
            case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
                // 整個滾動事件結束,隻觸發一次            順序: 6
                break;
            default:
                break;
        }
    }

    @Override
    public void onScroll(AbsListView absListView, int i, int i1, int i2)
    {
        // 一直在滾動中,多次觸發                          順序: 1、3、5
    }
}


之前一直很迷煳,後來仔細測試後得出上麵的結論


另外對於 ListView 圖片列表的滾動,應該在 

SCROLL_STATE_FLING   時讓圖片不顯示,提高滾動性能讓滾動小姑更平滑

SCROLL_STATE_IDLE     時顯示當前屏幕可見的圖片


對於 onScroll() 接口方法基本上不用他


之前看文檔上的說法,用穀歌翻譯出來以為 onScroll 方法是滾動完成後的回調,結果實測是滾動執行中的回調,列表稍滾動一段就要觸發幾十次

https://developer.android.com/reference/android/widget/AbsListView.OnScrollListener.html




不知是文檔沒描述對,還是翻譯不準確,看他語態過去完成時應該是描述錯了吧,感覺應該是  scrolling 才對

-----------------------------------------------------------------------------------------------------------------------

補充:

之前的順序測試還不夠細致,今天偶然測試間發現問題:

1. 當手指隻輕觸屏幕不拉動隻會觸發一次 onScroll 方法,不會觸發其他滾動事件

2. 如果手指觸碰屏幕後停滯一下再滑動則首先執行一次 onScroll 方法 然後才是 SCROLL_STATE_TOUCH_SCROLL  事件

3. 如果手指碰到屏幕後直接滑動則第一次就執行 SCROLL_STATE_TOUCH_SCROLL  事件

3. 觸發 SCROLL_STATE_TOUCH_SCROLL 事件後還會繼續多次觸發 onScroll 事件,而不是直接觸發 SCROLL_STATE_FLING 事件

4. 滾動後 不一定 會觸發  SCROLL_STATE_FLING 事件,可能和手指滑動的距離有關係

5. 滾動的過程中會多次調用 onScroll 方法

6. 除了 onScroll 觸發多次,其他事件在整個過程中隻會觸發一次





最後更新:2017-04-03 12:55:06

  上一篇:go 並發編程(三): 使用C++11實現無鎖stack(lock-free stack)
  下一篇:go Object-C中的字符串對象2-可變字符串