Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 获取滚动视图垂直滚动方向_Android - Fatal编程技术网

Android 获取滚动视图垂直滚动方向

Android 获取滚动视图垂直滚动方向,android,Android,欢迎各位 我有scrollview,我想知道滚动方向是向上还是向下 因为我想在滚动到底部时隐藏actionbar选项卡(如twitter应用程序) 试过了,但没用 wrap_layout.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (ev

欢迎各位 我有scrollview,我想知道滚动方向是向上还是向下

因为我想在滚动到底部时隐藏actionbar选项卡(如twitter应用程序)

试过了,但没用

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;
            }
        });

最简单的方法是创建这样的自定义滚动视图

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);
  }
}
然后遍历onScrollChanged()方法

@覆盖
受保护的无效onScrollChanged(int-scrollX、int-scrollY、int-oldScrollX、int-oldScrollY){
super.onScrollChanged(scrollX、scrollY、oldScrollX、oldScrollY);

如果(滚动创建自定义滚动视图

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;
}

}
并添加监听器

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");
        }
    });

您只需将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
        }});
nsv.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener)(v,scrollX,scrollY,oldScrollX,oldScrollY)->{
如果(!nsv.cans)(1))
{
//滚动视图的底部
}
//到达滚动视图的顶部
如果(!nsv.cans(-1)){
//滚动视图顶部
}
//上下滚动

如果(滚动)只存储当前的y偏移,如果发生滚动,则获取差异。如果y偏移发生变化,则垂直滚动。首先,我尝试知道垂直方向(上/下)如果是垂直或水平秒,则不会。已经尝试过了,但不起作用。在滚动时,您可以从滚动视图中获取当前的y偏移量吗?如果是这样,如果您采用
difference=currentOffsetY-oldOffsetY
且该值为正值,则为正值(我相信是向下的),如果为负数,则向上。请参阅我在上面添加的代码。我发现oldScrollY在牛轧糖上始终返回0。在下一个作用域向上时,我能够跟踪旧滚动。
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
        }});