Android scrollview如何監聽滑動狀態
阿新 • • 發佈:2020-01-07
ScrollView
檢視的滾動過程,其實是在不斷修改原點座標。當手指觸控後,ScrollView會暫時攔截觸控事件,使用一個計時器。假如在計時器到點後沒有發生手指移動事件,那麼ScrollView傳送tracking events到被點選的subView;若是在計時器到點後發生了移動事件,那麼ScrollView取消tracking自己促發滾動。
首先說一下NestedScrollView 的滑動事件的監聽,
如果使用
nestedScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View v,int scrollX,int scrollY,int oldScrollX,int oldScrollY) { } });
這個方法在 API >= 23 時才可以使用,怎麼解決呢 。我們可以自己定義一個ScrollView
public class MyScrollView extends NestedScrollView { private OnScrollChanged mOnScrollChanged; public MyScrollView(Context context) { this(context,null); } public MyScrollView(Context context,AttributeSet attributeSet) { this(context,attributeSet,0); } public MyScrollView(Context context,AttributeSet attrs,int defStyleAttr) { super(context,attrs,defStyleAttr); } @Override protected void onScrollChanged(int l,int t,int oldl,int oldt) { super.onScrollChanged(l,t,oldl,oldt); if (mOnScrollChanged != null) { mOnScrollChanged.onScroll(l,oldt); } } public void setOnScrollChanged(OnScrollChanged onScrollChanged) { this.mOnScrollChanged = onScrollChanged; } public interface OnScrollChanged { void onScroll(int l,int oldt); } }
這樣我們就可以通過實現 onScrollChanged() 監聽滑動事件了 ,其中可以監測到滑動距離,這樣就可以做好多事情了;
但是現在有一個需求就是【滑動的時候隱藏 一個靠邊的懸浮框,不滑動是懸浮框顯示出來】,這樣的話就需要監測滑動狀態了。scrollview 不像recyclerview一樣可以監測滑動狀態。
以下是我的一個實現方案,通過CountDownTimer 來實現
在剛才的onScrollChanged 介面中增加方法
public interface OnScrollChanged { void onScroll(int l,int oldt); void onTouch(boolean isDown); }
然後重寫onTouchEvent方法
@Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if (mOnScrollChanged != null) { mOnScrollChanged.onTouch(false); } break; case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: if (mOnScrollChanged != null) { mOnScrollChanged.onTouch(true); } break; } return super.onTouchEvent(ev); }
這裡的isDown=true代表是按下或者滑動的狀態,對應ACTION_DOWN和ACTION_MOVE,fale代表ACTION_UP和ACTION_CANCEL
下面使用這個自定義的scrollerview
//靜止狀態 private final static int SCROLL_STATE_IDLE = 1; //拖動或者慣性滑動狀態 private final static int SCROLL_STATE_SCROLL = 2; //判斷是否是拖動狀態 boolean isDragState = false; int currentState = SCROLL_STATE_IDLE; //這裡採用100ms來判斷是否已經是靜止狀態,100ms結束後證明是靜止狀態 private CountDownTimer scrollCountTimer = new CountDownTimer(100,1) { @Override public void onTick(long millisUntilFinished) { } @Override public void onFinish() { setScrollState(SCROLL_STATE_IDLE); } }; private void initScrollView() { scrollView.setOnScrollChanged(new MyScrollView.OnScrollChanged() { @Override public void onScroll(int l,int oldt) { if (isDragState) {//拖動狀態單獨處理不再進行滾動狀態監測 return; } //滑動時先取消倒計時,設定滑動狀態 scrollCountTimer.cancel(); if(currentState != SCROLL_STATE_SCROLL) { setScrollState(SCROLL_STATE_SCROLL); } scrollCountTimer.start(); } @Override public void onTouch(boolean isDown) { isDragState = isDown; //我這裡把按下的狀態預設為了滾動的狀態,當然你也可以分開定義 if (isDown) { scrollCountTimer.cancel(); setScrollState(SCROLL_STATE_SCROLL); } else { scrollCountTimer.start(); } } }); //最後記得頁面銷燬時,cancel掉timer
總結
以上所述是小編給大家介紹的Android scrollview如何監聽滑動狀態,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!