Intereting Posts
Завершение текущей активности из фрагмента Как отключить CalendarView в DatePicker? Как создать программный пакет ProgressBar? FCM возвращает ошибку: NotRegistered после первого сообщения Android BLE Пассивное сканирование Android «говорит не удалось: не связан с движком tts» Зачем использовать WeakReference для прослушивателей Android? Фильтр списка фильтров Пользовательский адаптер не дает результата AutoCompleteTextView не показывает выпадающее меню, когда я нажимаю пробел после ввода полного слова / Dev / HAX отсутствует при каждом перезапуске компьютера Есть некоторая ошибка при компоновке загрузки Android, но не эффективна при запуске Как избежать блокировки самой прокрутки при использовании setNestedScrollingEnabled (false)? Не удается подключить отладчик Android Studio к процессу Android Запуск Android-сервиса каждые 5 минут Основное различие между Manifest и Programmatic регистрации BroadcastReceiver

Как обнаружить жестов салфетки на веб-просмотре

Я разрабатываю простое приложение для Android с RelativeLayout и WebView внутри.

Я должен обнаружить проведите снизу вверх, только в 20% левой части экрана. Поэтому, когда пользователь салфетки в этом пространстве снизу вверх, я должен показать пользовательский диалог.

Я пытаюсь:

 import android.app.Activity; import android.view.MotionEvent; import android.view.View; public class ActivitySwipeDetector implements View.OnTouchListener { static final String logTag = "ActivitySwipeDetector"; private Activity activity; static final int MIN_DISTANCE = 100; private float downY, upY; public ActivitySwipeDetector(Activity activity){ this.activity = activity; } public void onRightToLeftSwipe(){ } public void onLeftToRightSwipe(){ } public void onTopToBottomSwipe(){ } public void onBottomToTopSwipe(){ System.out.println("BOTTOM TO TOP SWIPE DONE!"); } public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: { downY = event.getY(); return true; } case MotionEvent.ACTION_UP: { upY = event.getY(); float deltaY = downY - upY; if(Math.abs(deltaY) > MIN_DISTANCE){ if(deltaY > 0) { this.onBottomToTopSwipe(); return true; } } else { return false; } return true; } } return false; } } layout = (RelativeLayout)this.findViewById(R.id.layout); layout.setOnTouchListener(activitySwipeDetector); 

Но это ничего не значит!

Поэтому я пытаюсь создать собственный веб-просмотр таким образом:

 import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.webkit.WebView; public class MyWebView extends WebView { public MyWebView(Context context) { super(context); } public MyWebView(Context context,AttributeSet set){ super(context,set); } @Override public boolean onTouchEvent(MotionEvent evt) { boolean consumed = super.onTouchEvent(evt); if (isClickable()) { switch (evt.getAction()) { case MotionEvent.ACTION_DOWN: lastTouchY = evt.getY(); downTime = evt.getEventTime(); hasMoved = false; break; case MotionEvent.ACTION_MOVE: hasMoved = moved(evt); break; case MotionEvent.ACTION_UP: float actualTouchY = evt.getY(); long currentTime = evt.getEventTime(); float difference = Math.abs(lastTouchY - actualTouchY); long time = currentTime - downTime; if ( (lastTouchY < actualTouchY) && (time < 220) && (difference > 100) ) { System.out.println("SWIPE1"); } if ( (lastTouchY > actualTouchY) && (time < 220) && (difference > 100) ) { System.out.println("SWIPE2"); } break; } } return consumed || isClickable(); } long downTime; private float lastTouchY; private boolean hasMoved = false; private boolean moved(MotionEvent evt) { return hasMoved || Math.abs(evt.getY() - lastTouchY) > 10.0; } } 

Но без успеха !!! Кто-нибудь может мне помочь?? Благодаря!!!!! 🙂

Solutions Collecting From Web of "Как обнаружить жестов салфетки на веб-просмотре"

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

 webView.setGestureDetector(new GestureDetector(new 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; } } 

Как сказал Андрей Москвичёв:

Его можно решить, не вызывая класс WebView, зарегистрировав touch listener: webview.setOnTouchListener(new OnTouchListener() ...) и вызывая gestureDetector.onTouchEvent(ev) из него.