Подтвердить что ты не робот

Fling Gesture и Webview в Android

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

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

Здесь мой основной onCreate и мой класс

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() {

....


}

}
4b9b3361

Ответ 1

Создайте GestureListener и GestureDetector. Вызовите GestureDetector.onTouchEvent, переопределив webview 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 touch, но iirc останавливает последующие события, передаваемые в GestureDetector. Это половина причины, по которой я реализую свою собственную, основанную на Android-источнике. iirc Я получил эту идею из учебников Sony Ericsson, которые можно скачать с рынка. Это 3D-список, который показывает код и его довольно легко адаптировать.

Ответ 2

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

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;
        }
    };
}

Ответ 3

@Han, простите @techiУслуги его невостребованного ответа.

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

super.onTouchEvent(event);