使用HorizontalScrollView,我如何检测用户在滚动视图后何时停止滚动?或者,我如何知道滚动停止时的位置(然后我可以将它与 onScrollChanged 一起使用)。
我继承了 HorizontalScrollView。我想要的是让视图在用户与其交互时表现自然,但是当它停止更新它的一些子视图时——如果我在视图滚动时这样做,它会在滚动过程中导致小的滞后。
谢谢
使用HorizontalScrollView,我如何检测用户在滚动视图后何时停止滚动?或者,我如何知道滚动停止时的位置(然后我可以将它与 onScrollChanged 一起使用)。
我继承了 HorizontalScrollView。我想要的是让视图在用户与其交互时表现自然,但是当它停止更新它的一些子视图时——如果我在视图滚动时这样做,它会在滚动过程中导致小的滞后。
谢谢
我编写了一个自定义类,HorizontalScrollView
它有一个带有滚动停止方法的接口,它给出了scrollX
滚动停止时的位置。这是代码:
public class CustomMCSDHorizontalScroll extends HorizontalScrollView {
private Runnable scrollerTask;
private int initialPosition;
private int newCheck = 100;
public interface onScrollStopedListner{
void onScrollStoped();
}
private onScrollStopedListner onScrollStoped;
public CustomMCSDHorizontalScroll(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
scrollerTask = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int newPosition = getScrollX();
if ( initialPosition - newPosition == 0 ) {
if ( onScrollStoped != null ) {
onScrollStoped.onScrollStoped();
}
} else {
initialPosition = getScrollX();
CustomMCSDHorizontalScroll.this.postDelayed(
scrollerTask, newCheck);
}
}
};
}
public void setOnScrollStopListner (CustomMCSDHorizontalScroll.
onScrollStopedListner listener) {
onScrollStoped = listener;
}
public void startScrollerTask(){
initialPosition = getScrollX();
CustomMCSDHorizontalScroll.this.postDelayed(scrollerTask, newCheck);
}
}
这是ontouch()
方法:
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (v.getId()) {
case R.id.mHorizontalScrollViewMain:
if (event.getAction() == KeyEvent.ACTION_UP) {
hsvUpperTab.startScrollerTask();
}
break;
case R.id.mHorizontalScrollViewSub:
if (event.getAction() == KeyEvent.ACTION_UP) {
hsvLowerTab.startScrollerTask();
}
default:
break;
}
return false;
}
这是onScrollStop()
方法:
hsvLowerTab.setOnScrollStopListner(new onScrollStopedListner() {
@Override
public void onScrollStoped() {
// TODO Auto-generated method stub
getLowerTabScrolled(hsvLowerTab.getScrollX());
}
});
hsvUpperTab.setOnScrollStopListner(new onScrollStopedListner() {
@Override
public void onScrollStoped() {
// TODO Auto-generated method stub
getUpperTabScrolled(hsvUpperTab.getScrollX());
}
});
您可以使用滚动条。
使用滚动条的步骤。
将 onFling 运动事件传递给滚动条方法
fling(int startX,int startY,int velocityX,int velocityY,int minX,int maxX,int minY,int maxY)
可以使用以下滚动条方法:
getFinalX() getFinalY()
或者
不断地扫描这个 isFinished() 值以查找是否结束。