Android onScrollChanged for Scrollview多次发射

Ang*_*elo 8 android event-handling scrollview

我对这个问题感到疯狂,从现在开始4个小时就深入挖掘它,我想我再也无法集中注意力了,如果这是一个简单的话,那就很抱歉.

基本上我想跟踪Scrollview上的ScrollY(不,我不能使用网格或列表)

我正在使用带有onScrollChanges侦听器的ViewTreeObserver.但是,它被多次激活.更糟糕的是:当它被调用4次中的3次时,scrollview的scrollY为0并且1次我得到正确的数量.然而,这并不像每4个电话是正确的,那一刻时会触发正确的值是随机的,我需要能够听的scrollPosition 0.

这是我用来观察我的Scrollview的代码:

mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {

        @Override
        public void onScrollChanged() {
           Log.d("StupidScrollView", "Scroll positionY: " + mScrollView.getScrollY());
        }
    });
Run Code Online (Sandbox Code Playgroud)

样本输出:

 D/StupidScrollView? Scroll positionY: 0
 D/StupidScrollView? Scroll positionY: 0
 D/StupidScrollView? Scroll positionY: 0
 D/StupidScrollView? Scroll positionY: 77
Run Code Online (Sandbox Code Playgroud)

我必须提一下,我在ViewPager中,我的片段包含需要观察的Scrollview.它听起来像是与此相关的一些问题.

提前致谢!

Ibr*_*rim 8

我看到了你的问题,我自己在使用scrollviews时遇到了很多麻烦.这是我在scrollview中获取scrollvalue的解决方案(我为你添加了一个System.out).

首先创建一个扩展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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我创建一个变量(在活动中)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);
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

在我的情况下,"t"值是滚动垂直变化多少,"l"是水平滚动,"oldl"和"oldt"是t&l的旧值,所以如果你需要知道它向上或向下滚动你可以使用if(oldt> t)等.

并在滚动视图中设置监听器,如下所示:

mScrollView.setOnScrollChangedListener(mOnScrollChangedListener);
Run Code Online (Sandbox Code Playgroud)