Бросок Жест и Webview в Android - PullRequest
12 голосов
/ 19 ноября 2010

У меня есть элемент управления webview, который должен поддерживать жест броска в Android, чтобы вызвать новую запись (загрузить новые данные). Это происходит в классе, который расширяет активность. Все примеры, которые я видел, показывают, как реализовать поддержку жестов для текстового представления, но ничего для веб-просмотра.

Мне нужно выполнить разные действия для левого и правого бросков. Буду признателен за любую помощь в коде, так как это поставит меня в тупик.

Вот мой основной способ создания и мой класс

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.os.Bundle;
import android.text.Html;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;

import android.webkit.WebView;

public class ArticleActivity extends Activity   {

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);



    Window  w = getWindow();

     w.requestFeature(Window.FEATURE_LEFT_ICON);

     WebView webview = new WebView(this);
     setContentView(webview); 



     w.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
     R.drawable.gq);




    setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
    populateFields();
    webview.loadData(question + answer, "text/html", "utf-8");



  //   
}
private void populateFields() {

....


}

}

Ответы [ 3 ]

12 голосов
/ 20 ноября 2010

Создание GestureListener и GestureDetector.Вызовите GestureDetector.onTouchEvent, переопределив onTouchEvent веб-просмотра.

Вы также можете просто переопределить Activity onTouchEvent, кстати.Я могу опубликовать некоторый код, если вам нужно.

Редактировать: Код в соответствии с запросом.

public class Main extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyWebView webview = new MyWebView(this);
        setContentView(webview);
    }

    class MyWebView extends WebView {
        Context context;
        GestureDetector gd;

        public MyWebView(Context context) {
            super(context);

            this.context = context;
            gd = new GestureDetector(context, sogl);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            return gd.onTouchEvent(event);
        }

        GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() {
            public boolean onDown(MotionEvent event) {
                return true;
            }

            public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
                if (event1.getRawX() > event2.getRawX()) {
                    show_toast("swipe left");
                } else {
                    show_toast("swipe right");
                }
                return true;
            }
        };

        void show_toast(final String text) {
            Toast t = Toast.makeText(context, text, Toast.LENGTH_SHORT);
            t.show();
        }
    }
}

@ littleFluffyKitty.Я предполагаю по умолчанию события касания WebView, которые вы имеете в виду, когда он вызывает элементы управления масштабированием и т. Д.?Я не проверял это.Я обнаружил, что реализация собственного обнаружения жестов работает лучше (хотя я не уверен, что он будет работать лучше в WebView).Вам нужно рассматривать сенсорное событие как три отдельных компонента.Нажатие вниз, движение (если есть) и пресс-релиз, как нажатие вниз, перемещение, отпускание всегда происходят.

Если вы возвращаете false на onDown, действие должно быть переданоОбработчик событий касания WebView, но он останавливает последующие события, передаваемые в GestureDetector.Что является половиной причины, по которой я реализую свой собственный, основанный на источнике Android.iirc Я получил идею от Sony Ericsson Tutorials, которую можно скачать с рынка.Это 3D-список, который показывает код и его довольно легко адаптировать.

5 голосов
/ 25 ноября 2011

Я обновил код, теперь он позволяет вызывать собственные обработчики событий, если пользователь не бросил

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.webkit.WebView;

public class MyWebView extends WebView {
    private boolean flinged;

    private static final int SWIPE_MIN_DISTANCE = 320;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;

    public MyWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        gd = new GestureDetector(context, sogl);
    }

    GestureDetector gd;


    @Override
    public boolean onTouchEvent(MotionEvent event) {
         gd.onTouchEvent(event);
         if (flinged) {
             flinged = false;
             return true;
         } else {
             return super.onTouchEvent(event);
         }
    }

    GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() {
    // your fling code here
        public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
            if (event1.getX() < 1200 && event1.getX() > 80) {
                return false;
            }
            if (Math.abs(event1.getY() - event1.getY()) > SWIPE_MAX_OFF_PATH)
                return false;
            if(event1.getX() - event2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                loadUrl("javascript:changePage('LEFT')");
                Log.i("Swiped","swipe left");
                flinged = true;
            } else if (event2.getX() - event1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                loadUrl("javascript:changePage('RIGHT')");
                Log.i("Swiped","swipe right");
                flinged = true;
            }
            return true;
        }
    };
}
2 голосов
/ 26 мая 2011

@ Хан, простите @techiServices за его невостребованный ответ.

Проблема с кодом выше в том, что во всех случаях он возвращает true для onFling и onDown.Вместо этого вы хотите вернуть false для событий, которые вы не обрабатываете, или для условий в тех событиях, которые вы не обрабатываете.Или действительно, в onTouchEvent вы можете передать вызов базовому классу, возвращая

super.onTouchEvent(event);
...