156

レイアウトで を使用しHorizontalScrollViewていますが、ユーザーがスクロールの開始点と終了点に到達したことを識別する必要があります。

ListView私は試してみましたが、onScrollListenerスクロールの開始点と終了点を見つけることができます。

私は自分で同じことをしようとしましたScrollviewが、それは不可能のようです。私が必要とするものを達成するための他の可能な方法はありますか?

4

9 に答える 9

410

View のすべてのインスタンスが を呼び出しますgetViewTreeObserver()。のインスタンスを保持している場合、 メソッドを使用して をそれにViewTreeObserver追加できます。OnScrollChangedListener()addOnScrollChangedListener()

このクラスの詳細については、こちらを参照してください

すべてのスクロールイベントを認識できますが、座標はありません。ただし、リスナー内からgetScrollY()またはを使用して取得できます。getScrollX()

scrollView.getViewTreeObserver().addOnScrollChangedListener(new OnScrollChangedListener() {
    @Override
    public void onScrollChanged() {
        int scrollY = rootScrollView.getScrollY(); // For ScrollView
        int scrollX = rootScrollView.getScrollX(); // For HorizontalScrollView
        // DO SOMETHING WITH THE SCROLL COORDINATES
    }
});
于 2014-04-29T13:06:40.937 に答える
6

ビューのスクロール位置を知りたい場合は、View クラスで次の拡​​張関数を使用できます。

fun View?.onScroll(callback: (x: Int, y: Int) -> Unit) {
    var oldX = 0
    var oldY = 0
    this?.viewTreeObserver?.addOnScrollChangedListener {
        if (oldX != scrollX || oldY != scrollY) {
            callback(scrollX, scrollY)
            oldX = scrollX
            oldY = scrollY
        }
    }
}
于 2018-04-18T14:48:22.173 に答える
1

カスタム ScrollView クラスを定義し、次のようにスクロールするときに呼び出されるインターフェイスを追加できます。

public class ScrollChangeListenerScrollView extends HorizontalScrollView {


private MyScrollListener mMyScrollListener;

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

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

public ScrollChangeListenerScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}


public void setOnMyScrollListener(MyScrollListener myScrollListener){
    this.mMyScrollListener = myScrollListener;
}


@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    super.onScrollChanged(l, t, oldl, oldt);
    if(mMyScrollListener!=null){
        mMyScrollListener.onScrollChange(this,l,t,oldl,oldt);
    }

}

public interface MyScrollListener {
    void onScrollChange(View view,int scrollX,int scrollY,int oldScrollX, int oldScrollY);
}

}
于 2018-12-03T12:23:08.670 に答える
0
    // --------Start Scroll Bar Slide--------
    final HorizontalScrollView xHorizontalScrollViewHeader = (HorizontalScrollView) findViewById(R.id.HorizontalScrollViewHeader);
    final HorizontalScrollView xHorizontalScrollViewData = (HorizontalScrollView) findViewById(R.id.HorizontalScrollViewData);
    xHorizontalScrollViewData.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            int scrollX; int scrollY;
            scrollX=xHorizontalScrollViewData.getScrollX();
            scrollY=xHorizontalScrollViewData.getScrollY();
            xHorizontalScrollViewHeader.scrollTo(scrollX, scrollY);
        }
    });
    // ---------End Scroll Bar Slide---------
于 2017-08-28T02:49:25.593 に答える