由于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;
}
此外,有没有什么方法可以让它像任何滚动视图一样完整?我的意思是当你快速滑动然后松开时,它会立即进行,它可以保持一段时间的速度,所以滚动很长距离都需要很长时间。
答案 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;
}
请注意,我允许滚动到比最大值更远的一行,以便从视图底部到底线留出一些空间。
然而,这不是普通的滚动视图所做的,因为当执行滑动时它会继续滚动,但如果没有其他答案允许我这样做,那对我来说就足够了。