Android的webview:检测滚动

我需要知道如何检测用户是否无法在webView中滚动。 我想在用户向左或向右滑动时生成一个动作,但只有当用户不能滚动时:

IF the user swipes to the left AND the webview can't scroll to left THEN do something ELSE let the webview scroll 

Solutions Collecting From Web of "Android的webview:检测滚动"

我find了一个适合我的解决scheme,我在2.3 API中检查了类WebView的源代码,并find了如何使用2.1 API来实现。 也许它可以使用较旧的API:

 public class CustomWebView extends WebView { private float oldX; // indicate if horizontal scrollbar can't go more to the left private boolean overScrollLeft = false; // indicate if horizontal scrollbar can't go more to the right private boolean overScrollRight = false; // indicate if horizontal scrollbar can't go more to the left OR right private boolean isScrolling = false; public CustomWebView(Context context) { super(context); // TODO Auto-generated constructor stub } public CustomWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public CustomWebView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } @Override public boolean onTouchEvent(MotionEvent event) { // width of the vertical scrollbar int scrollBarWidth = getVerticalScrollbarWidth(); // width of the view depending of you set in the layout int viewWidth = computeHorizontalScrollExtent(); // width of the webpage depending of the zoom int innerWidth = computeHorizontalScrollRange(); // position of the left side of the horizontal scrollbar int scrollBarLeftPos = computeHorizontalScrollOffset(); // position of the right side of the horizontal scrollbar, the width of scroll is the width of view minus the width of vertical scrollbar int scrollBarRightPos = scrollBarLeftPos + viewWidth - scrollBarWidth; // if left pos of scroll bar is 0 left over scrolling is true if(scrollBarLeftPos == 0) { overScrollLeft = true; } else { overScrollLeft = false; } // if right pos of scroll bar is superior to webpage width: right over scrolling is true if(scrollBarRightPos >= innerWidth) { overScrollRight = true; } else { overScrollRight = false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // when user touch the screen // if scrollbar is the most left or right if(overScrollLeft || overScrollRight) { isScrolling = false; } else { isScrolling = true; } oldX = event.getX(); break; case MotionEvent.ACTION_UP: // when user stop to touch the screen // if scrollbar can't go more to the left OR right // this allow to force the user to do another gesture when he reach a side if(!isScrolling) { if(event.getX() > oldX && overScrollLeft) { // left action } if(event.getX() < oldX && overScrollRight) { // right actio } } break; default: break; } return super.onTouchEvent(event); } } 

在API中有一些有趣的方法,但它们是受保护的,我认为你可以创build自己的WebView(扩展WebView)并使用这些方法并公开它们。 具体来说,也许你可以使用这两个onScrollChanged和onOverScroll 。

我认为这将解决这个问题:

 int horizontalOffset = computeHorizontalScrollOffset(); int contentWidth = (int) Math.floor(getContentWidth() * getScale()); int viewportWidth = getWidth(); // 1 just for random error boolean reachRightEnd = ((horizontalOffset + viewportWidth) >= (contentWidth - 1)); boolean reachLeftEnd = (horizontalOffset == 0);