レイアウトで を使用しHorizontalScrollView
ていますが、ユーザーがスクロールの開始点と終了点に到達したことを識別する必要があります。
ListView
私は試してみましたが、onScrollListener
スクロールの開始点と終了点を見つけることができます。
私は自分で同じことをしようとしましたScrollview
が、それは不可能のようです。私が必要とするものを達成するための他の可能な方法はありますか?
レイアウトで を使用しHorizontalScrollView
ていますが、ユーザーがスクロールの開始点と終了点に到達したことを識別する必要があります。
ListView
私は試してみましたが、onScrollListener
スクロールの開始点と終了点を見つけることができます。
私は自分で同じことをしようとしましたScrollview
が、それは不可能のようです。私が必要とするものを達成するための他の可能な方法はありますか?
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
}
});
ビューのスクロール位置を知りたい場合は、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
}
}
}
カスタム 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);
}
}
// --------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---------