我无法使用Scroller以编程方式滚动ScrollView,因此到目前为止还没有触摸手势。我想以一定的速度向下滚动ScrollView,只要传感器的数据在一定范围内。所以基本上我想在第一次数据进入有效范围时开始滚动,然后不干扰滚动过程,直到数据再次超出范围。我不想将onSensorChanged直接连接到scrollBy(),因为它可能无法在其他设备上正常工作。这是我到目前为止所得到的:
在我的onCreate中:
tx = new TextView(ShowLyrics.this);
mainscrollarea = (ScrollView) findViewById (R.id.mainscrollarea);
scroller = new Scroller(getApplicationContext(), new LinearInterpolator());
tx.setScroller(scroller);
在我的onSensorChanged:
if(integratedAngle - scrollTolerance > pointzero){ //this is checking for the data range and works so far
if(!scrollingDown){
scrollText("down");
}
}
和scrollText函数:
void scrollText(String direction){
if(direction.matches("down")){
scrollingUp = false;
scrollingDown = true;
scroller.forceFinished(true);
int currY = mainscrollarea.getScrollY();
int endY = tx.getHeight();
int distance = endY - currY;
scroller.startScroll(0, currY, 0, -distance, 5000);
}
if(direction.matches("up")){
//nothing yet
}
}
所以现在我已经硬编码5秒钟向下滚动,但没有任何反应。 onSensorChanged中Scroller的getCurrY的Log.d()仅吐出0。如果有人能指出我正确的方向,我会很感激。
答案 0 :(得分:0)
我像你一样进行自动滚动。除非我依赖用户输入(当用户用手指靠近屏幕边缘时,我开始以特定速度滚动)。
我使用的runnable与滚动条的功能相同。
private final DragScroller mDragScroller;
/** inner class */
private class DragScroller implements Runnable {
private SCROLL_DIRECTION mDirection;
private boolean mIsFinished = true;
DragScroller(Context context) {
}
void start(SCROLL_DIRECTION direction) {
mState = STATE.DRAG_SCROLL;
mIsFinished = false;
mDirection = direction;
post(this);
}
@Override
public void run() {
if (mIsFinished) {
return;
}
if (mDirection.equals(SCROLL_DIRECTION.UP)) {
// check if the touch is still in the correct area...
if (!isOverThreshold(0, mTempY, mDragScrollThreshold)) {
scrollTo(0, ensureScrollBoundaries(getScrollY() - mDragScrollSpeed));
post(this);
} else {
forceFinish();
}
} else {
// check if the touch is still in the correct area...
if (!isOverThreshold(getHeight(), mTempY, mDragScrollThreshold)) {
scrollTo(0, ensureScrollBoundaries(getScrollY() + mDragScrollSpeed));
post(this);
} else {
forceFinish();
}
}
}
public boolean isFinished() {
return mIsFinished;
}
public void forceFinish() {
mIsFinished = true;
}
}
它只是由mDragScroller.start(SCROLL_DIRECTION.UP);
开始,可以由mDragScroller.forceFinish();
修改强>
根据您的评论,您希望使用速度的持续时间。这有点问题,因为滚动的结果速度取决于您在给定时间内滚动的距离。简短的数学样本:在1分钟内滚动600px意味着你每秒滚动10px这不是那么糟糕(取决于你滚动的内容,文本或图像...)但是如果你靠近边缘并且你只需要滚动60px,结果速度取决于给定的持续时间1分钟意味着每秒1px非常慢。
鉴于这个例子,你应该根据总持续时间而不是每秒像素数来确定滚动速度。
是的,没有必要使用Scroller进行编程滚动。只是可以自行调用它直到它应该停止并且速度可以调整到你需要的......