【问题标题】:How to get scroll states in a Horizontal Scroll View: Android如何在水平滚动视图中获取滚动状态:Android
【发布时间】:2014-02-27 11:26:11
【问题描述】:

我正在使用水平滚动视图,并且我想在某些情况下隐藏第一项。现在我使用 on touch 监听器来查看用户滚动了多少,并查看第一个项目/视图是否可见,然后根据一些计算执行 scrollTo()。 一切都很好,直到我意识到这并不能解决用户只是甩动而水平滚动视图滚动一段距离的情况。所以,我无法做出正确的计算。因此,我意识到最好的办法是检查第一个项目是否可见,或者仅在水平滚动视图最终停止滚动时检查第一个项目是否可见,这是由于触摸或甩动的结果。

但我找不到一种方法来告诉我水平滚动条何时停止滚动并且仍然静止。

有人可以帮我解决这个问题吗?

谢谢。

【问题讨论】:

    标签: android horizontalscrollview onscrolllistener


    【解决方案1】:

    扩展 ScrollView 以添加滚动侦听器。然后您可以使用该自定义 View 并在侦听器中接收事件(代码带有一个 scrollView,但将其转换为 Horizo​​ntalScrollView 应该非常简单)。

    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.widget.ScrollView;
    
    public class ScrollViewWithListener extends ScrollView{
    
        private boolean mCurrentlyTouching;
        private boolean mCurrentlyFling;
    
        public interface ScrollViewListener {
            public void onScrollChanged(ScrollViewWithListener scrollView, int x, int y, int oldx, int oldy);
            public void onEndScroll();
         }
    
        private ScrollViewListener scrollViewListener = null;
    
        public ScrollViewWithListener(Context context) {
            super(context);
        }
    
        public ScrollViewWithListener(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public ScrollViewWithListener(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        public void setScrollViewListener(ScrollViewListener scrollViewListener) {
           this.scrollViewListener = scrollViewListener;
        }
    
        @Override
        public void fling(int velocityY) {
            super.fling(velocityY);
            mCurrentlyFling = true;
        }
    
        @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);
            if (scrollViewListener != null) {
                scrollViewListener.onScrollChanged(this, l, t, oldl, oldt);
            }
    
           if (Math.abs(t - oldt) < 2 || t >= getMeasuredHeight() || t == 0) {
               if(!mCurrentlyTouching){
                    if (scrollViewListener != null) {
                       Log.d("SCROLL WITH LISTENER", "-- OnEndScroll");
                       scrollViewListener.onEndScroll();
                   }
               }
              mCurrentlyFling = false;
           }
    
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
           switch (ev.getAction()) {
          case MotionEvent.ACTION_DOWN:
               mCurrentlyTouching = true;
               break;
          case MotionEvent.ACTION_UP:
          case MotionEvent.ACTION_CANCEL:
              mCurrentlyTouching = false;
              if(!mCurrentlyFling){
                   if (scrollViewListener != null) {
                      Log.d("SCROLL WITH LISTENER", "-- OnEndScroll");
                      scrollViewListener.onEndScroll();
                   }
               }
              break;
    
          default:
             break;
            }
            return super.onTouchEvent(ev);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            switch (ev.getAction()) {
           case MotionEvent.ACTION_DOWN:
               mCurrentlyTouching = true;
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                mCurrentlyTouching = false;
                if(!mCurrentlyFling){
                   if (scrollViewListener != null) {
                     Log.d("SCROLL WITH LISTENER", "-- OnEndScroll");
                       scrollViewListener.onEndScroll();
                   }
               }
                break;
    
            default:
                break;
           }
           return super.onInterceptTouchEvent(ev);
        }
    }
    

    然后你像这样在你的xml中使用它:

    <com.example.ScrollViewWithListener
        android:id="@+id/scrollWithListener"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true" >
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TEST" />
    </com.example.ScrollViewWithListener>
    

    不要忘记设置您希望在滚动更改时收到通知的侦听器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多