如今不少的App都會有雙擊
Toolbar
後將內容列表RecyclerView
平緩滾動至頂部的功能,這個功能大大提高了用戶體驗,那麼,該如何實現呢bash
實現這個功能的關鍵能夠分爲兩點ide
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);
}
});
複製代碼