ScrollView实现滚动到顶部和底部的判断和监听

自定义ScrollView:

public class CustomScrollView extends ScrollView {



    //回调监听接口

    private OnScrollChangeListener mOnScrollChangeListener;

    //标识是否滑动到顶部

    private boolean isScrollToStart = false;

    //标识是否滑动到底部

    private boolean isScrollToEnd = false;

    private static final int CODE_TO_START = 0x001;

    private static final int CODE_TO_END = 0x002;

    private Handler mHandler = new Handler() {



        @Override

        public void handleMessage(Message msg) {

            super.handleMessage(msg);

            switch (msg.what) {

                case CODE_TO_START:

                    //重置标志“滑动到顶部”时的标志位

                    isScrollToStart = false;

                    break;

                case CODE_TO_END:

                    //重置标志“滑动到底部”时的标志位

                    isScrollToEnd = false;

                    break;

                default:

                    break;

            }

        }

    };



    public CustomScrollView(Context context) {

        super(context);

    }



    public CustomScrollView(Context context, AttributeSet attrs) {

        super(context, attrs);

    }



    public CustomScrollView(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 (mOnScrollChangeListener != null) {

            Log.i("CustomScrollView", "scrollY:" + getScrollY());

            //滚动到顶部,ScrollView存在回弹效果效应(这里只会调用两次,如果用<=0,会多次触发)

            if (getScrollY() == 0) {

                //过滤操作,优化为一次调用

                if (!isScrollToStart) {

                    isScrollToStart = true;

                    mHandler.sendEmptyMessageDelayed(CODE_TO_START, 200);

                    Log.e("CustomScrollView", "toStart");

                    mOnScrollChangeListener.onScrollToStart();

                }

            } else {

                View contentView = getChildAt(0);

                if (contentView != null && contentView.getMeasuredHeight() == (getScrollY() + getHeight())) {

                    //滚动到底部,ScrollView存在回弹效果效应

                    //优化,只过滤第一次

                    if (!isScrollToEnd) {

                        isScrollToEnd = true;

                        mHandler.sendEmptyMessageDelayed(CODE_TO_END, 200);

                        Log.e("CustomScrollView", "toEnd,scrollY:" + getScrollY());

                        mOnScrollChangeListener.onScrollToEnd();

                    }



                }

            }

        }



    }



    //滑动监听接口

    public interface OnScrollChangeListener {



        //滑动到顶部时的回调

        void onScrollToStart();



        //滑动到底部时的回调

        void onScrollToEnd();

    }



    public void setOnScrollChangeListener(OnScrollChangeListener onScrollChangeListener) {

        mOnScrollChangeListener = onScrollChangeListener;

    }

}

Activity中:

public class MainActivity extends AppCompatActivity implements CustomScrollView.OnScrollChangeListener{
 	private CustomScrollView scrollView;
	 @Override    
	 protected void onCreate(Bundle savedInstanceState) {        
	 super.onCreate(savedInstanceState);        
	 setContentView(R.layout.activity_main);        
	 scrollView = findViewById(R.id.scrollView);        
	 scrollView.setOnScrollChangeListener(this);   
	  } 
	  
	@Override    
	public void onScrollToStart() {        
		Toast.makeText(this, "滑动到顶部了", Toast.LENGTH_SHORT).show();   
	 }     

	@Override    
	public void onScrollToEnd() {        
	Toast.makeText(this, "滑动到底部了", Toast.LENGTH_SHORT).show();    
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值