ScrollBy()滚动最大值

时间:2014-08-21 21:24:06

标签: android

由于Android不允许我只是让它处理TextView上的滚动(链接到我写的那个问题的链接)我需要自己处理它。我正在使用的代码非常简单,并且它在一定程度上工作,有一个问题,它只是在最大值之后滚动(从顶部或底部开始)。我发现使用canScrollVertically(direction)有效,但这限制了我对API lvl 14及更高版本,这是我不想做的事情。这是我目前的代码:

float prevY;

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        int dy = (int) (prevY - event.getY());
        if (myView.canScrollVertically(dy)) { //This is the line i want to get rid of
            myView.scrollBy(0, dy);
        }
    }
    prevY = event.getY();

    return true;
}

此外,有没有什么方法可以让它像任何滚动视图一样完整?我的意思是当你快速滑动然后松开时,它会立即进行,它可以保持一段时间的速度,所以滚动很长距离都需要很长时间。

2 个答案:

答案 0 :(得分:0)

试试这段代码:

  @Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        View view = (View) getChildAt(getChildCount()-1);
        int diff = (view.getBottom()-(getHeight()+getScrollY()+view.getTop()));// Calculate the scrolldiff
        if( diff == 0 ){  //  the bottom has been reached
            Log.d(ScrollTest.LOG_TAG, "MyScrollView: Bottom has been reached" );
        }
        super.onScrollChanged(l, t, oldl, oldt);
}

答案 1 :(得分:0)

从大卫的答案开始,以及大量的试验和错误,这里有一个版本,允许滚动过去的顶部和底部,并从onTouch()工作我alredy。

float prevY;

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_MOVE) {
        int dy = (int) (prevY - event.getY());
        if (dy < 0) {
            int distanceToTop = myView.getScrollY();
            if (-distanceToTop < dy) {
                myView.scrollBy(0, dy);
            } else {
                myView.scrollTo(0, 0);
            }
        } else {
            int realHeight = (myView.getLineCount() + 1)
                    * myView.getLineHeight();
            int distanceToBottom = myView.getScrollY() - realHeight
                    + myView.getHeight();
            if (-distanceToBottom > dy) {
                myView.scrollBy(0, dy);
            } else {
                myView.scrollTo(0, realHeight - myView.getHeight());
            }
        }
    }
    prevY = event.getY();
    return true;
}

请注意,我允许滚动到比最大值更远的一行,以便从视图底部到底线留出一些空间。

然而,这不是普通的滚动视图所做的,因为当执行滑动时它会继续滚动,但如果没有其他答案允许我这样做,那对我来说就足够了。