使用GestureDetector實現雙擊Toolbar後將RecyclerView平緩滾動至頂部

如今不少的App都會有雙擊Toolbar後將內容列表RecyclerView平緩滾動至頂部的功能,這個功能大大提高了用戶體驗,那麼,該如何實現呢bash

實現這個功能的關鍵能夠分爲兩點ide

  1. 實現雙擊手勢的監聽
  2. 實現RecyclerView的平滑滾動

第一點,實現雙擊手勢監聽,這個我當時走了一點點彎路,我當時想在onTouch裏本身手動實現雙擊的判斷,可是寫了一半忽然想到,google不可能想不到雙擊手勢處理的這種場景,必然會有相關的類來處理的,因而搜了一下,果不其然,sdk裏有個GestureDetector就是專門幹這個的,不光雙擊、還有甩動、單擊等等幾個手勢的處理,google果真很貼心,都替咱們想好了。而後,就是第二點,實現RecyclerView平滑滾動到頂部,這裏也有一個須要注意的點,那就是平滑滾動的觸發條件,能夠想象一下,若是如今RecyclerView已經顯示到了第9999條數據(舉個例子,實際可能遇不到這麼大的數),這時要觸發平滑滾動,從第9999慢慢的平滑滾動回第0,用戶會崩潰的,因此,咱們須要設置一個閾值,到了某一個值纔開始平滑滾動,沒到這個值就直接瞬間滾動到這個值,而後再開始平滑滾動,這樣在用戶看來就像是整個在平滑滾動,並且不會太慢。說了這麼多,最終咱們仍是要用代碼來實現它,那麼咱們仍是來上代碼吧,看看怎麼實現Toolbar的雙擊監聽:ui

//代碼片斷
final GestureDetector gestureDetector = new GestureDetector(SomeActivity.this, new GestureDetector.SimpleOnGestureListener() { //使用SimpleOnGestureListener能夠只覆蓋實現本身想要的手勢
    @Override
    public boolean onDoubleTap(MotionEvent e) { //DoubleTap手勢的處理
        LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        if (linearLayoutManager.findFirstCompletelyVisibleItemPosition() != 0) { //判斷一下,若是如今RecyclerView不是已經顯示了最頂部條目時,才須要作滾動到頂部的處理
            if (linearLayoutManager.getItemCount() > SMOOTH_SCROLL_THRESHOLD) { //SMOOTH_SCROLL_THRESHOLD就是上邊咱們說的那個觸發平滑滾動的閾值,這裏設置一個比較小的數就能夠了,好比 10 ,當如今RecyclerView顯示的數目大於這個閾值時就須要進行前邊提到的「先瞬間滾動而後再平滑滾動的處理了」
                recyclerView.scrollToPosition(SMOOTH_SCROLL_THRESHOLD); //先瞬間滾動到THRESHOLD位置
            }
            recyclerView.smoothScrollToPosition(0); //而後再繼續平滑滾動,這樣既不會太慢又保留了平滑的效果
        }
        return super.onDoubleTap(e);
    }
});

toolbar.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) { //使用GestureDetector對Toolbar進行手勢監聽
                return gestureDetector.onTouchEvent(event);
    }
});
複製代碼
相關文章
相關標籤/搜索