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

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