WebView с жестом смахивания

У меня есть страница с первой частью, содержащей анимацию. когда пользователь проводит пальцем, анимация идет и появляется веб-просмотр. При свайпе вверх веб-просмотр уходит, и снова появляется анимация. поскольку веб-просмотр потреблял прикосновение, я переопределяю прикосновение веб-просмотра и передаю его объекту детектора жестов. Но я действительно хочу, чтобы элемент управления переключался между веб-просмотром и детектором жестов. На данный момент работает детектор жестов или веб-просмотр, но они не работают вместе. Любая помощь?

Вот что я делаю сейчас:

    webView.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub

            return gestureDetector.onTouchEvent(event);
            // return false;

        }
    });

Детектор жестов обрабатывает переключение между анимацией и веб-просмотром:

    gestureDetector = new GestureDetector(getActivity(),
            new GestureDetector.SimpleOnGestureListener() {
                /* Function to pause the video on tap */
                @Override
                public boolean onSingleTapConfirmed(MotionEvent e) {
                    /* On Touch event pressed play and pause the videoplayer */
                    return true;
                }

                /*
                 * OnDown() has to return true for the fling methof to take
                 * place
                 */
                @Override
                public boolean onDown(MotionEvent e) {
                    return true;
                }

                @Override
                public boolean onFling(MotionEvent e1, MotionEvent e2,
                        float velocityX, float velocityY) {

person Deepak Senapati    schedule 06.05.2013    source источник


Ответы (1)


Используйте GestureDetector с пользовательским веб-представлением.

webView.setGestureDetector (новый GestureDetector (новый CustomeGestureDetector ()));

детектор жестов:

private class CustomeGestureDetector extends SimpleOnGestureListener {      
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if(e1 == null || e2 == null) return false;
        if(e1.getPointerCount() > 1 || e2.getPointerCount() > 1) return false;
        else {
            try { // right to left swipe .. go to next page
                if(e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 800) {
                    //do your stuff
                    return true;
                } //left to right swipe .. go to prev page
                else if (e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 800) {
                    //do your stuff
                    return true;
                } //bottom to top, go to next document
                else if(e1.getY() - e2.getY() > 100 && Math.abs(velocityY) > 800 
                        && webView.getScrollY() >= webView.getScale() * (webView.getContentHeight() - webView.getHeight())) {
                    //do your stuff
                    return true;
                } //top to bottom, go to prev document
                else if (e2.getY() - e1.getY() > 100 && Math.abs(velocityY) > 800 ) {
                    //do your stuff
                    return true;
                } 
            } catch (Exception e) { // nothing
            }
            return false;
        }
    }
}

настраиваемое веб-представление

public final class CustomWebView extends WebView {

private GestureDetector gestureDetector;

/**
 * @param context
 * @param attrs
 * @param defStyle
 */
public CustomWebView(Context context) {
    super(context);
}

/**
 * @param context
 * @param attrs
 * @param defStyle
 */
public CustomWebView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

/**
 * @param context
 * @param attrs
 * @param defStyle
 */
public CustomWebView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

/* 
 * @see android.webkit.WebView#onScrollChanged(int, int, int, int)
 */
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    super.onScrollChanged(l, t, oldl, oldt);
}

/* 
 * @see android.webkit.WebView#onTouchEvent(android.view.MotionEvent)
 */
@Override
public boolean onTouchEvent(MotionEvent ev) {
    return gestureDetector.onTouchEvent(ev) || super.onTouchEvent(ev);
}

public void setGestureDetector(GestureDetector gestureDetector) {
    this.gestureDetector = gestureDetector;
}
}
person Nirav Ranpara    schedule 06.05.2013
comment
Спасибо за ответ. Я видел этот пример. Прокрутка работает, но управление не приходит в веб-просмотр. Есть ли какое-либо условие, которое я должен проверить? - person Deepak Senapati; 06.05.2013
comment
webview.getSettings().setBuiltInZoomControls(true); - person Nirav Ranpara; 06.05.2013
comment
Мне не нужны элементы управления масштабированием. Я просто хочу, чтобы событие смахивания было отправлено детектору жестов, чтобы оно обрабатывалось внутри метода onfling(). - person Deepak Senapati; 06.05.2013