2016-11-01 2 views
1

J'utilise des événements de mouvement avec WebView donc je ne peux pas utiliser directement sur touchlistenerDétecter Tap unique sur WebView

J'utilise la manière suivante

package com.example.webviewdemo; 

public class OnSwipeTouchListener implements OnTouchListener { 

private final GestureDetector gestureDetector; 
private long touchDownMs; 
private Handler handler; 
private int numberOfTaps; 
private long lastTapTimeMs; 


public OnSwipeTouchListener(Context context) { 
    gestureDetector = new GestureDetector(context, new GestureListener()); 
} 

public void onSwipeLeft() { 
} 

public void onSwipeRight() { 
} 
public void newTouch(){ 

} 
public boolean onTouch(View v, MotionEvent event) { 
     gestureDetector.onTouchEvent(event); 
     handler= new Handler(); 
    if(event.getAction()== MotionEvent.ACTION_MOVE) 
    { 
     return true; 
    } 



     if(event.getAction()== MotionEvent.ACTION_DOWN){ 

      touchDownMs = System.currentTimeMillis(); 
      return v.onTouchEvent(event); 
    } 
    else if(event.getAction()== MotionEvent.ACTION_UP){ 

      handler.removeCallbacksAndMessages(null); 

      if ((System.currentTimeMillis() - touchDownMs) > ViewConfiguration.getTapTimeout()) { 
       //it was not a tap 

       numberOfTaps = 0; 
       lastTapTimeMs = 0; 

      } 

      if (numberOfTaps > 0 
        && (System.currentTimeMillis() - lastTapTimeMs) < ViewConfiguration.getDoubleTapTimeout()) { 
       numberOfTaps += 1; 
      } else { 
       numberOfTaps = 1; 
      } 

      lastTapTimeMs = System.currentTimeMillis(); 

      if (numberOfTaps == 3) { 
//     Toast.makeText(getApplicationContext(), "triple", Toast.LENGTH_SHORT).show(); 
       //handle triple tap 
      } else if (numberOfTaps == 2) { 
       handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         //handle double tap 
         newTouch(); 
//       Toast.makeText(getApplicationContext(), "double", Toast.LENGTH_SHORT).show(); 
        } 
       }, ViewConfiguration.getDoubleTapTimeout()); 
      } 
      return v.onTouchEvent(event); 
    } 
      else{ 
       return v.onTouchEvent(event); 
      } 


} 

private final class GestureListener extends SimpleOnGestureListener { 

    private static final int SWIPE_DISTANCE_THRESHOLD = 100; 
    private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     float distanceX = e2.getX() - e1.getX(); 
     float distanceY = e2.getY() - e1.getY(); 
     if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
      if (distanceX > 0) 
       onSwipeRight(); 
      else 
       onSwipeLeft(); 
      return true; 
     } 
     return false; 
    } 

} 


} 

mise en œuvre sur mon WebView

webView.setOnTouchListener(new OnSwipeTouchListener(this) { 
         @Override 
         public void onSwipeLeft() { 
          // Whatever 


         } 
         @Override 
         public void onSwipeRight() { 
          // TODO Auto-generated method stub 



         } 
         @Override 
         public void newTouch() { 
          // TODO Auto-generated method stub 

         } 

        }); 

Je peux obtenir double taps et triple taps à partir de cela, mais j'ai seulement besoin d'un robinet complet non seulement ACTION_UP ou ACTION_DOWN, mais les deux ensemble dans l'espace de quelques millisecondes. si dans mon code j'écris numberOfTaps == 1 alors il est en train de détecter Action_Down pas complètement tapé. Je dois obtenir une détection complète du robinet. merci à l'avance

j'ai vu déjà This et This mais ne fonctionne pas

Répondre

0
package com.example.webviewdemo; 

public class OnSwipeTouchListener implements OnTouchListener { 

private final GestureDetector gestureDetector; 
private static final int MAX_CLICK_DURATION = 1000; 
private static final int MAX_CLICK_DISTANCE = 15; 
static Context mcontext; 
private long pressStartTime; 
private float pressedX; 
private float pressedY; 
private boolean stayedWithinClickDistance; 

public OnSwipeTouchListener(Context context) { 
    gestureDetector = new GestureDetector(context, new GestureListener()); 
    this.mcontext=context; 
} 

public void onSwipeLeft() { 
} 

public void onSwipeRight() { 
} 
public void newTouch(){ 

} 
public boolean onTouch(View v, MotionEvent event) { 
     gestureDetector.onTouchEvent(event); 

    if(event.getAction()== MotionEvent.ACTION_MOVE) 
    { 
      if (stayedWithinClickDistance && distance(pressedX, pressedY, event.getX(), event.getY()) > MAX_CLICK_DISTANCE) { 
       stayedWithinClickDistance = false; 
      } 
     return true; 
    } 

    else if (event.getAction()== MotionEvent.ACTION_DOWN) { 
     pressStartTime = System.currentTimeMillis();     
     pressedX = event.getX(); 
     pressedY = event.getY(); 
     stayedWithinClickDistance = true; 

     return v.onTouchEvent(event); 
    } 
    else if(event.getAction()== MotionEvent.ACTION_UP) { 

     long pressDuration = System.currentTimeMillis() - pressStartTime; 
     if (pressDuration < MAX_CLICK_DURATION && stayedWithinClickDistance) { 
      newTouch(); 
     } 

     return v.onTouchEvent(event); 
    } 
    else{ 
     return v.onTouchEvent(event); 
    } 

} 
private static float distance(float x1, float y1, float x2, float y2) { 
    float dx = x1 - x2; 
    float dy = y1 - y2; 
    float distanceInPx = (float) Math.sqrt(dx * dx + dy * dy); 
    return pxToDp(distanceInPx); 
} 

private static float pxToDp(float px) { 
    return px/mcontext.getResources().getDisplayMetrics().density; 
} 


private final class GestureListener extends SimpleOnGestureListener { 

    private static final int SWIPE_DISTANCE_THRESHOLD = 100; 
    private static final int SWIPE_VELOCITY_THRESHOLD = 100; 

    @Override 
    public boolean onDown(MotionEvent e) { 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     float distanceX = e2.getX() - e1.getX(); 
     float distanceY = e2.getY() - e1.getY(); 
     if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { 
      if (distanceX > 0) 
       onSwipeRight(); 
      else 
       onSwipeLeft(); 
      return true; 
     } 
     return false; 
    } 

} 


} 

a résolu le problème en utilisant cette How to distinguish between move and click in onTouchEvent()?