如何使用滚动条自动滚动滚动视图?

时间:2013-04-14 10:34:22

标签: android scrollview scroller

我无法使用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。如果有人能指出我正确的方向,我会很感激。

1 个答案:

答案 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进行编程滚动。只是可以自行调用它直到它应该停止并且速度可以调整到你需要的......