Android - Добавление GestureDetector в веб-просмотр

Я хотел бы добавить класс GestureDetector в свой веб-просмотр, чтобы я мог управлять распространенными жестами, такими как двойное нажатие.

Вот чего я пытаюсь достичь:

  • SingleTap будет нормально работать
  • DoubleTap откроет элементы (подробнее об этом ниже)

Что касается DoubleTap - у рассматриваемого сайта есть исходный код, который определяет, как обрабатываются одиночные и двойные щелчки для определенных элементов. В нем говорится, что один щелчок выбирает элемент, а двойной щелчок открывает этот элемент. Я должен быть расплывчатым относительно пунктов, поскольку это не общедоступный сайт.

Мне не нужно настраивать флинги или свайпы. Я просто пытаюсь воссоздать одиночные и двойные щелчки мыши ПК.

РЕДАКТИРОВАТЬ: Я добавил в предложениях, приведенных ниже, от Пат. Я изменил кое-что по своему вкусу и добавил кое-что из других источников.

Я использовал этот вопрос, чтобы помочь строить свою деятельность вместе с помощью Пэт. Используя код «Первого пути», он правильно загружает мое приложение и успешно перезагружает страницу, как было задумано. Теперь мне просто нужно добавить другие обработчики событий и правильно их настроить. Отправлю окончательный код, когда он заработает, и отмечу ответ Пэта как правильный.

Этот пользователь задает тот же вопрос без ответа: Как делать двойные щелчки работать.

В нем говорится, что это устаревший GestureDetector (new MyGestureDetector ()); - я должен это исправить?

РЕДАКТИРОВАТЬ 2: Поскольку фактический вопрос заключался в том, как добавить gesturedetecor в веб-просмотр, и я смог это сделать, я отмечу ответ Пэта как правильный. Несмотря на то, что я действительно хотел сделать doubleTap = двойной щелчок, я не спрашивал об этом в моем заголовке, поэтому я создам для этого новый вопрос.

import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.SslErrorHandler;
import android.net.http.SslError;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.GestureDetector;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;

public class MainActivity extends Activity{
    WebView webview;    

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webview = (WebView) findViewById(R.id.webview);   
        //Do we want/need to enable Java?
        webview.getSettings().setJavaScriptEnabled(true); 
        //Here we allow for zoom controls - pinch
        webview.getSettings().setBuiltInZoomControls(true);
        //Here we remove the zoom control buttons - requires API 11
        webview.getSettings().setDisplayZoomControls(false);
        //Here we clear the Cache and SSL Preferences       
        webview.clearCache(true);
        webview.clearSslPreferences();
        //Do we need to enable scroll bars to allow people to scroll left and right?        
        webview.setHorizontalScrollBarEnabled(true);
        webview.setVerticalScrollBarEnabled(true);
        webview.setWebViewClient(new WebViewClient());
        webview.loadUrl("website");

        final GestureDetector gd = new GestureDetector(new MyGestureDetector());
        View.OnTouchListener gl = new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                return gd.onTouchEvent(event);
            }
        };
        webview.setOnTouchListener(gl);
    }

class MyGestureDetector extends SimpleOnGestureListener {    
    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        Log.i("", "DoubleTapEvent");
        return true;
        }   

    }    


// Ignore SSL certificate errors    
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();
    }

//Would like to have a Menu Button to refresh the page - or really just bring you to the login page - for use when the session times out    
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(1, 1, 0, "Refresh");
    //removed below to have only buttons show
    //getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
    }

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
    case R.id.refresh:
        webview.loadUrl("website");
        return true;
    }
    return super.onOptionsItemSelected(item);

}

}

~ Дэн


person Dan    schedule 20.12.2013    source источник


Ответы (1)


Вы спрашиваете, как настроить слушателя для обработки одиночных / двойных нажатий? Подкласс GestureDetector.SimpleOnGestureListener и установите его как прослушиватель касаний на вашем:

public class GestureListener extends GestureDetector.SimpleOnGestureListener {

а затем переопределите методы onSingleTapConfirmed для одного нажатия и onDoubleTap. Затем установите прослушиватель касаний в своем веб-просмотре, а onTouch просто вызовите onTouchEvent вашего GestureListener.

Редактировать:

 final GestureDetector gestureDetector = new GestureDetector(context, new GestureListener());

                webview.setOnTouchListener(new OnTouchListener() {

                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        return gestureDetector.onTouchEvent(event);
                    }
                });
person pat    schedule 20.12.2013
comment
Это может быть то, что я ищу - я ищу примеры того, как прямо сейчас реализовать сенсорный слушатель в моем коде. - person Dan; 21.12.2013
comment
см. мою правку выше, создайте экземпляр детектора жестов, установите ontouchlistener, затем вызовите gesturedetector.ontouchevent. Отметьте ответ как принятый, если это то, что вы ищете. - person pat; 21.12.2013
comment
Мне сложно понять, где эти дополнения должны быть в коде моей основной деятельности. - person Dan; 21.12.2013
comment
класс детектора жестов должен быть создан где-то в действии, ontouchlistener может быть установлен в любом месте после того, как вы найдете ссылку на свой веб-просмотр (после findviewbyid) - person pat; 21.12.2013
comment
Могу ли я не использовать орудия в моем классе Activity? открытый класс MainActivity расширяет Activity реализует GestureDetector.SimpleOnGestureListener {? - person Dan; 21.12.2013
comment
вы можете реализовать ontouchlistener, но вам нужно создать собственный детектор жестов, чтобы переопределить методы - person pat; 21.12.2013
comment
Я отредактировал свой код, чтобы отобразить изменения. Мне осталось исправить 2 ошибки. - person Dan; 21.12.2013
comment
Детектор жестов был добавлен с помощью цепочек, цитируемых в редактировании выше, а также с помощью Пэта. Был создан отдельный вопрос о двойных щелчках - stackoverflow.com/questions/20721548/ - person Dan; 22.12.2013