ScrollView 滑動停止監聽

  遇到一個需求,在ScrollView中設置一個按鈕,滑動的時候隱藏,滑動停止之後1秒再重新顯示出來。

  由於ScrollView沒有提供直接的監聽方法,所以要自定義一個ScrollView;實現思路:創建Handler,在ScrollView滑動的時候,先清空所有消息,然後發送延時消息,如果能接收到消息,說明滑動停止,下面是具體實現的代碼

package app.view;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.widget.NestedScrollView;
import android.util.AttributeSet;

/**
 Created by XiaoDaAn on 2020/04/02 */
public class ObservableScrollView extends NestedScrollView
{
	
	private OnScrollStatusListener onScrollStatusListener;
	
	public ObservableScrollView(Context context) {
		super(context);
	}
	
	public ObservableScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	public ObservableScrollView(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 (onScrollStatusListener != null) {
			onScrollStatusListener.onScrolling();
			mHandler.removeCallbacksAndMessages(null);
			mHandler.sendEmptyMessageDelayed(0x01, 200);
		}
	}
	
	public void setOnScrollStatusListener(OnScrollStatusListener onScrollStatusListener) {
		this.onScrollStatusListener = onScrollStatusListener;
	}
	
	private Handler mHandler = new Handler() {
		
		@Override public void handleMessage(Message msg) {
			super.handleMessage(msg);
			switch (msg.what) {
			case 0x01:
				if (onScrollStatusListener != null) {
					onScrollStatusListener.onScrollStop();
				}
				break;
			}
		}
	};
	
	@Override protected void onDetachedFromWindow() {
		super.onDetachedFromWindow();
		mHandler.removeCallbacksAndMessages(null);
	}
	
	public interface OnScrollStatusListener {
		void onScrollStop();
		
		void onScrolling();
	}
}

在代碼中調用:

@BindView(R.id.sv_cjf1)
ObservableScrollView sv_cjf1;


//ScrollView滑動停止監聽
		sv_cjf1.setOnScrollStatusListener(new ObservableScrollView.OnScrollStatusListener(){
			@Override
			public void onScrollStop(){
                //滑動停止 1秒後顯示按鈕
				if(isHasPos !=1){    //後臺返回數據  判斷是否需要展示這個按鈕
					Handler handler = new Handler();
					handler.postDelayed(new Runnable() {
						@Override
						public void run() {
							iv_cj_guide.setVisibility(View.VISIBLE);
						}
					}, 1000);
				}
				
			}
			
			@Override
			public void onScrolling(){
                //滑動中 隱藏按鈕
				if(isHasPos!=1){ //後臺返回數據  判斷是否需要展示這個按鈕
					
					iv_cj_guide.setVisibility(View.GONE);
				}
			}
		});

參考https://www.jianshu.com/p/208952db0205

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章