Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android webview : detect scroll

I need to know how to detect if the user can't scroll anymore in a webView. I want to generate an action when the user swipes to the left or right, but only if the user can't scroll:

IF the user swipes to the left AND the webview can't scroll to left THEN
 do something
ELSE
 let the webview scroll
like image 817
Carbodrache Avatar asked Jan 10 '11 07:01

Carbodrache


1 Answers

I found a solution which work for me, I check the source code of class WebView in 2.3 API and find how to do it with a 2.1 API. Maybe it can work with older 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);
    }

}
like image 110
Carbodrache Avatar answered Sep 17 '22 10:09

Carbodrache