简体   繁体   English

获取 ScrollView 垂直滚动方向

[英]Get ScrollView Vertical Scrolling Direction

Welcome guys I've scrollview and I want to get the scrolling direction if it's up or down欢迎大家我有滚动视图,我想知道滚动方向是向上还是向下

because I want to hide actionbar tabs when scrolling to the bottom (Like twitter app)因为我想在滚动到底部时隐藏操作栏选项卡(如 Twitter 应用程序)

Tried this but didn't work试过这个但没有用

wrap_layout.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    y = event.getY();
                    break;
                case MotionEvent.ACTION_UP:
                    Log.d("scroll", event.getY() - y + "");
                    break;

                default:
                    break;
                }
                return false;
            }
        });

The easiest way to do is to create a custom ScrollView like this最简单的方法是像这样创建一个自定义的 ScrollView

public class ObservableScrollView extends ScrollView{


   public ObservableScrollView(Context context) {
       super(context);
   }

   public ObservableScrollView(Context context, AttributeSet attrs) {
     super(context, attrs);
 }

   public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) {
       super(context, attrs, defStyle);
  }
}

and then ovverride the onScrollChanged() method然后覆盖 onScrollChanged() 方法

 @Override
protected void onScrollChanged(int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
    super.onScrollChanged(scrollX, scrollY, oldScrollX, oldScrollY);
    if(scrollY<oldScrollY){
      //vertical scrolling down
    }else{
    //vertical scrolling upp
    }
    if(scrollX<oldScrollX){
      //horizontal scrolling down
    }else{
    //horizontal scrolling upp
   }
}

and finally you can create a custom interface to pass these invents最后你可以创建一个自定义界面来传递这些发明

create custom scrollview;创建自定义滚动视图;

public class CustomScrollView extends ScrollView {

private float mTouchPosition;
private float mReleasePosition;

public interface OnScrollViewListener {
    void onScrollChanged(CustomScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY);
    void scrollUp();
    void scrollDown();
}

private OnScrollViewListener mOnScrollViewListener;

public CustomScrollView(Context context) {
    this(context, null, 0);
}

public CustomScrollView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public CustomScrollView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    mOnScrollViewListener.onScrollChanged( this, l, t, oldl, oldt );
    super.onScrollChanged(l, t, oldl, oldt);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        mTouchPosition = event.getY();
    }
    if (event.getAction() == MotionEvent.ACTION_UP) {
        mReleasePosition = event.getY();

        if (mTouchPosition - mReleasePosition > 0) {
            mOnScrollViewListener.scrollDown();
        } else {
            mOnScrollViewListener.scrollUp();
        }
    }
    return super.onTouchEvent(event);
}

public void setOnScrollViewListener(OnScrollViewListener l) {
    this.mOnScrollViewListener = l;
}

}

and add listener;并添加监听器;

yourCustomScrollView.setOnScrollViewListener(new CustomScrollView.OnScrollViewListener() {
        @Override
        public void onScrollChanged(CustomScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

        }

        @Override
        public void scrollUp() {
            Timber.e("SCROLL UP");
        }

        @Override
        public void scrollDown() {
            Timber.e("SCROLL DOWN");
        }
    });

You can just set ScrollListener to your scrollView and handle it as following.您可以将 ScrollListener 设置为您的 scrollView 并按如下方式处理它。

nsv.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> {

        if (!nsv.canScrollVertically(1))
        {
            // bottom of scroll view
        }

        //reached at top of scrollView
        if (!nsv.canScrollVertically(-1)) {
            // top of scroll view
        }

        //scrolling up and down
        if(scrollY<oldScrollY){
            //vertical scrolling down
        }else{
            //vertical scrolling upp
        }

        if(scrollX<oldScrollX){
          //horizontal scrolling down
        }else{
          //horizontal scrolling upp
        }});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM