当前位置:   article > 正文

【ScrollView】Android ScrollView监听滑动事件_android onscrollchangelistener

android onscrollchangelistener

Android的ScrollView没有像ListView那样,使用setOnScrollListener监听滑动事件,通过自定义的View可以实现,源码如下:

  1. package com.ql.view;
  2. import android.content.Context;
  3. import android.os.Handler;
  4. import android.os.Message;
  5. import android.util.AttributeSet;
  6. import android.view.MotionEvent;
  7. import android.view.View;
  8. import android.widget.ScrollView;
  9. public class LazyScrollView extends ScrollView{
  10. private static final String tag="LazyScrollView";
  11. private Handler handler;
  12. private View view;
  13. public LazyScrollView(Context context) {
  14. super(context);
  15. // TODO Auto-generated constructor stub
  16. }
  17. public LazyScrollView(Context context, AttributeSet attrs) {
  18. super(context, attrs);
  19. // TODO Auto-generated constructor stub
  20. }
  21. public LazyScrollView(Context context, AttributeSet attrs, int defStyle) {
  22. super(context, attrs, defStyle);
  23. // TODO Auto-generated constructor stub
  24. }
  25. //这个获得总的高度
  26. public int computeVerticalScrollRange(){
  27. return super.computeHorizontalScrollRange();
  28. }
  29. public int computeVerticalScrollOffset(){
  30. return super.computeVerticalScrollOffset();
  31. }
  32. private void init(){
  33. this.setOnTouchListener(onTouchListener);
  34. handler=new Handler(){
  35. @Override
  36. public void handleMessage(Message msg) {
  37. // process incoming messages here
  38. super.handleMessage(msg);
  39. switch(msg.what){
  40. case 1:
  41. if(view.getMeasuredHeight() <= getScrollY() + getHeight()) {
  42. if(onScrollListener!=null){
  43. onScrollListener.onBottom();
  44. }
  45. }else if(getScrollY()==0){
  46. if(onScrollListener!=null){
  47. onScrollListener.onTop();
  48. }
  49. }
  50. else{
  51. if(onScrollListener!=null){
  52. onScrollListener.onScroll();
  53. }
  54. }
  55. break;
  56. default:
  57. break;
  58. }
  59. }
  60. };
  61. }
  62. OnTouchListener onTouchListener=new OnTouchListener(){
  63. @Override
  64. public boolean onTouch(View v, MotionEvent event) {
  65. // TODO Auto-generated method stub
  66. switch (event.getAction()) {
  67. case MotionEvent.ACTION_DOWN:
  68. break;
  69. case MotionEvent.ACTION_UP:
  70. if(view!=null&&onScrollListener!=null){
  71. handler.sendMessageDelayed(handler.obtainMessage(1), 200);
  72. }
  73. break;
  74. default:
  75. break;
  76. }
  77. return false;
  78. }
  79. };
  80. /**
  81. * 获得参考的View,主要是为了获得它的MeasuredHeight,然后和滚动条的ScrollY+getHeight作比较。
  82. */
  83. public void getView(){
  84. this.view=getChildAt(0);
  85. if(view!=null){
  86. init();
  87. }
  88. }
  89. /**
  90. * 定义接口
  91. * @author admin
  92. *
  93. */
  94. public interface OnScrollListener{
  95. void onBottom();
  96. void onTop();
  97. void onScroll();
  98. }
  99. private OnScrollListener onScrollListener;
  100. public void setOnScrollListener(OnScrollListener onScrollListener){
  101. this.onScrollListener=onScrollListener;
  102. }
  103. }

使用方法如下:

  1. scrollView=(LazyScrollView)findViewById(R.id.scrollView);
  2. scrollView.getView();
  3. scrollView.setOnScrollListener(new OnScrollListener() {
  4. @Override
  5. public void onTop() {
  6. // TODO Auto-generated method stub
  7. Log.d(tag,"------滚动到最上方------");
  8. }
  9. @Override
  10. public void onScroll() {
  11. // TODO Auto-generated method stub
  12. Log.d(tag,"没有到最下方,也不是最上方");
  13. }
  14. @Override
  15. public void onBottom() {
  16. // TODO Auto-generated method stub
  17. Log.d(tag,"------滚动到最下方------");
  18. }
  19. });

补充一点:

控制ScrollView滑动到底部,可以使用scrollTo方法,但是相比之下,fullScroll方法:

scrollView.fullScroll(ScrollView.FOCUS_DOWN);滚动到底部;

scrollView.fullScroll(ScrollView.FOCUS_UP);滚动到顶部。

需要注意的是,该方法不能直接被调用,

因为Android很多函数都是基于消息队列来同步,

所以需要一部操作,addView完之后,不等于马上就会显示,而是在队列中等待处理,虽然很快,

但是如果立即调用fullScroll, view可能还没有显示出来,所以会失败应该通过handler在新线程中更新:

  1. scrollView.post(new Runnable() {
  2. @Override
  3. public void run() {
  4. scrollView.fullScroll(View.FOCUS_DOWN);
  5. }
  6. });






声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/921135
推荐阅读
相关标签
  

闽ICP备14008679号