您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Android中怎么利用scrollview監聽滑動狀態,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
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, t, oldl, oldt); } } public void setOnScrollChanged(OnScrollChanged onScrollChanged) { this.mOnScrollChanged = onScrollChanged; } public interface OnScrollChanged { void onScroll(int l, int t, int oldl, int oldt); }}
這樣我們就可以通過實現 onScrollChanged() 監聽滑動事件了 ,其中可以監測到滑動距離,這樣就可以做好多事情了;
但是現在有一個需求就是【滑動的時候隱藏 一個靠邊的懸浮框,不滑動是懸浮框顯示出來】,這樣的話就需要監測滑動狀態了。scrollview 不像recyclerview一樣可以監測滑動狀態。
以下是我的一個實現方案,通過CountDownTimer 來實現
在剛才的onScrollChanged 接口中增加方法
public interface OnScrollChanged { void onScroll(int l, int t, int oldl, 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 t, int oldl, 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監聽滑動狀態了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。