4 votes

Comment remplacer certains événements gestuels sur un webview, mais laisser passer les autres ?

Je suis encore en train de comprendre les tenants et aboutissants du SDK, alors soyez indulgent avec moi.

J'essaie donc d'implémenter un Webview, qui garde les contrôles de zoom multitouch et le défilement vertical intacts (la classe webview les gère) tout en verrouillant le défilement horizontal sur le Webview, et en implémentant des flèches horizontales pour chercher de nouvelles données.

J'ai trouvé ça : Geste de flottement et Webview dans Android . J'ai donc pris ce code pour comprendre comment implémenter cela dans mon application plus tard, donc je travaille à partir de là (la réponse, bien sûr).

Et j'ai commencé à adapter le code à mon costume. Par exemple :

   if (event1.getRawX() > event2.getRawX() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100) {
    show_toast("swipe left");
   } else if(event1.getRawX() < event2.getRawX() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100){
    show_toast("swipe right");

En fait, il ne détecte QUE les mouvements horizontaux.

Cependant, je n'ai pas encore trouvé comment faire en sorte que les flèches horizontales déclenchent une action de mon choix, tandis que les flèches verticales continuent de contrôler le défilement de la WebView en question.

Ma première idée était d'essayer quelque chose comme pageUp/pageDown ou scrollTo sur la webview mais cela ne peut pas fonctionner puisque j'ai étendu la classe webview à MyWebView et donc je n'ai pas encore d'objet instancié de ce type.

Voici le code complet, si nécessaire :

package test.fling;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.webkit.WebView;
import android.widget.Toast;

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

    MyWebView webview = new MyWebView(this);
    webview.loadUrl("http://en.wikipedia.org/wiki/Android");
    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() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100) {
    show_toast("swipe left");
   } else if(event1.getRawX() < event2.getRawX() && StrictMath.abs(event1.getRawY()-event2.getRawY())<100){
    show_toast("swipe right");
   } else {
     //MyWebView.pageUp(true); /*can't work, as explained above*/
   }
return true;
  }
 };

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

Toute aide serait grandement appréciée. Merci !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X