Comment détecter un geste de balayage sur webview
je suis l'élaboration d'une simple application android avec une RelativeLayout
et un WebView
à l'intérieur.
J'ai pour détecter faites glisser le doigt de bas en haut faire que dans les 20% de la partie gauche de l'écran. Ainsi, lorsque l'utilisateur de glisser dans l'espace du bas vers le haut, je dois afficher une boîte de dialogue personnaliser.
Ce que je cherche est:
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);
Mais il ne fait rien!
Donc j'ai essayer de créer un personnalisé webview de cette façon:
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;
}
}
mais sans succès!!! quelqu'un peut-il m'aider?? Merci!!!!! 🙂
OriginalL'auteur JackTurky | 2012-09-25
Vous devez vous connecter pour publier un commentaire.
Utiliser un GestureDetector avec un affichage web..
le geste détecteur:
Le web personnalisée de vue:
Comme dit par Андрей Москвичёв:
Il peut être résolu sans dérivation WebView classe, par l'inscription de toucher l'auditeur:
webview.setOnTouchListener(new OnTouchListener() ...)
et de l'appel degestureDetector.onTouchEvent(ev)
.désolé j'ai oublié d'ajouter le web personnalisée de vue..fait maintenant
super!!!! j'ai supprimer tout sauf le si de bas vers le haut ( ce dont j'ai besoin ) et je vois que si je laisse webView.getScrollY() >= webView.getScale() * (webView.getContentHeight() - webView.getHeight() il me donner exception. mais il fonctionne très bien!!!!!!! puis-je me dire comment reconnaître que le geste que sur une partie de l'écran ? merci!
quelque chose comme si(e1,.getX() > yourLimit || e2.getX() > yourLimit) return false; (//ne pas manipuler)
Merci pour l'information. Il peut être résolu sans dérivation WebView classe, par l'inscription de toucher l'auditeur: webview.setOnTouchListener(nouveau OnTouchListener() ...) et en appelant gestureDetector.onTouchEvent(ev).
OriginalL'auteur