Android的onScrollChanged为Scrollview触发多次



我想在Scrollview上跟踪scrollly(不,我不能使用网格或列表)

我使用ViewTreeObserver与一个onScrollChanges监听器。然而,它被多次触发。更糟糕的是,当它被调用了4次中的3次时,scrollview的滚动是0,只有1次我得到了正确的数值。然而,这并不是每4次调用都是正确的,当正确的值被触发的那一刻是随机的,我需要能够听到scrollposition 0。

下面是我用来观察Scrollview的代码:

mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
           Log.d("StupidScrollView", "Scroll positionY: " + mScrollView.getScrollY());
        }
    });
样本输出:

 D/StupidScrollView﹕ Scroll positionY: 0
 D/StupidScrollView﹕ Scroll positionY: 0
 D/StupidScrollView﹕ Scroll positionY: 0
 D/StupidScrollView﹕ Scroll positionY: 77

我不得不提,我在一个ViewPager和我的片段包含一个滚动视图需要观察。这听起来像是与此相关的问题

我看到你的问题,我有很多麻烦与滚动视图我自己。这是我的解决方案,以获得scrollview中的scrollvalue(我添加了一个系统。为你着想)。

首先创建一个扩展ScrollView的自定义类,并创建一个具有onScrollChanged方法的侦听器,如下所示:

public class ProductDetailScrollView extends ScrollView {
    public interface OnScrollChangedListener {
        void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt);
    }
    private OnScrollChangedListener mOnScrollChangedListener;
    public void setOnScrollChangedListener(OnScrollChangedListener listener) {
        mOnScrollChangedListener = listener;
    }
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (mOnScrollChangedListener != null) {
            mOnScrollChangedListener.onScrollChanged(this, l, t, oldl, oldt);
        }
    }
    public ProductDetailHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    public ProductDetailHorizontalScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public ProductDetailHorizontalScrollView(Context context) {
        super(context);
    }
}

然后我创建一个变量(在活动中)mOnScrollChangedListener,并将其设置为mScrollView的监听器:

private ProductDetailScrollView.OnScrollChangedListener mOnScrollChangedListener = new ProductDetailScrollView.OnScrollChangedListener() {
    public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) {
        System.out.println("Scrolled: " + t);
        //Parallax Effect on scroll
        if (t > 0) {
            final float newY = (t / 4.0f) * -1.0f;
            mProductImageContainer.setY(newY);
        } else {
            mProductImageContainer.setY(0.0f);
        }
    }
};

在我的例子中,"t"的值是纵向滚动条的变化量,"l"是横向滚动条的变化量,"oldl"&"oldt"是t &所以如果你想知道它是向上还是向下滚动你可以使用if(oldt> t)等等。

你在scrollview中这样设置监听器:

mScrollView.setOnScrollChangedListener(mOnScrollChangedListener);

我也有同样的问题。我用android.support.v4.widget.NestedScrollView代替了我的ScrollView

然后实现NestedScrollView.OnScrollChangeListener

将监听器连接到我的NestedScrollView

现在我检测到滚动条的变化。:)

相关内容

  • 没有找到相关文章

最新更新