遇到一個需求,在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);
}
}
});