Android 水平滚动视图-投掷后计算停止位置
使用HorizontalScrollView,我如何检测用户抛出视图后滚动何时停止?或者,我如何知道当滚动停止时滚动将处于什么位置(然后我可以将其与onScrollChanged一起使用) 我继承了横向滚动视图。我想要的是,当用户与视图交互时,视图的行为自然,但当它停止更新其一些子视图时——如果我在视图滚动时这样做,则会在滚动过程中造成小的延迟 谢谢您也可以使用 使用滚动条的步骤Android 水平滚动视图-投掷后计算停止位置,android,horizontalscrollview,onfling,Android,Horizontalscrollview,Onfling,使用HorizontalScrollView,我如何检测用户抛出视图后滚动何时停止?或者,我如何知道当滚动停止时滚动将处于什么位置(然后我可以将其与onScrollChanged一起使用) 我继承了横向滚动视图。我想要的是,当用户与视图交互时,视图的行为自然,但当它停止更新其一些子视图时——如果我在视图滚动时这样做,则会在滚动过程中造成小的延迟 谢谢您也可以使用 使用滚动条的步骤 子类HorizontalScrollView具有自定义视图,并重写onTouchEvent方法,onIntercep
不断扫描此isFinished()值,以查看是否结束了滚动。我为
HorizontalScrollView
编写了一个自定义类,该类具有scroll stop方法接口,在滚动停止时提供了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;
}
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());
}
});
以下是onScrollStop()
方法:
@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;
}
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());
}
});
除此之外,您还需要为水平滚动视图提供MotionEvent。@khotmanish..您有此示例代码吗?我发现很难使用它…同样的要求,我已经尝试了几乎所有的方法,如果你发现了什么,请告诉我。我已经找到了解决方案,并将上传到这里,以便其他人需要它。