2012-03-20 66 views

回答

2

试试这个,

private GestureDetector gestureDetector; 
View.OnTouchListener gestureListener; 

gestureDetector = new GestureDetector(new MyGestureDetector()); 
    gestureListener = new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if (gestureDetector.onTouchEvent(event)) { 
       return true; 
      } 
      return false; 
     } 
    }; 

MyGestureDetector

class MyGestureDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
       return false; 
      // right to left swipe 
      if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 

//你的代码

  } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 

//你的代码

  } 
     } catch (Exception e) { 
      Log.e(LOG_TAG, "onFling", e); 

     } 
     return false; 
    } 
} 

通过检查滑动距离,您可以区分触摸并以某种方式轻扫。我希望这能帮到您。

+0

Thanx帮助! – Navdroid 2012-03-20 09:53:39

0

这是一个处理自己手势的扩展WebView。这可能会帮助那些发现外部UI区域正在吸收手势并且难以让听众进入的人。这是我的问题。这里是检测自身所有的滑动和双whatsits web视图:

package org.this_voice.modabrowser; 

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.GestureDetector; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.MotionEvent; 
import android.webkit.WebView; 
import android.widget.Toast; 

public class MoDaView extends WebView implements 
    GestureDetector.OnDoubleTapListener { 

Context mContext; 
GestureDetector gestureDetector = new GestureDetector(
     new mGestureDetector()); 

public MoDaView(Context context) { 
    super(context); 
    mContext = context; 
    gestureDetector.setOnDoubleTapListener(this); 
    gestureDetector.setIsLongpressEnabled(true); 
} 

public MoDaView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    mContext = context; 
    gestureDetector.setOnDoubleTapListener(this); 
    gestureDetector.setIsLongpressEnabled(true); 
} 

public MoDaView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    mContext = context; 
    gestureDetector.setOnDoubleTapListener(this); 
    gestureDetector.setIsLongpressEnabled(true); 
} 

private static final int SWIPE_MIN_DISTANCE = 120; 
private static final int SWIPE_MAX_OFF_PATH = 250; 
private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

class mGestureDetector extends SimpleOnGestureListener { 

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

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, 
      float distanceX, float distanceY) { 
     return super.onScroll(e1, e2, distanceX, distanceY); 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
     float velocityY) { 
     try { 
      if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
      return false; 
     // right to left swipe 
      if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
       && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Toast.makeText(mContext, "Left Swipe", Toast.LENGTH_SHORT) 
        .show(); 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
       && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       Toast.makeText(mContext, "Right Swipe", Toast.LENGTH_SHORT) 
        .show(); 
      } 
     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 

} 

public boolean onTouchEvent(MotionEvent event) { 
    return gestureDetector.onTouchEvent(event) || super.onTouchEvent(event); 
} 

@Override 
public boolean onDoubleTap(MotionEvent event) { 
    Toast.makeText(mContext, "onDoubleTap", Toast.LENGTH_SHORT).show(); 
    return true; 
} 

@Override 
public boolean onDoubleTapEvent(MotionEvent event) { 
    Toast.makeText(mContext, "onDoubleTapEvent", Toast.LENGTH_SHORT).show(); 
    return true; 
} 

@Override 
public boolean onSingleTapConfirmed(MotionEvent event) { 
    Toast.makeText(mContext, "onSingleTapConfirmed", Toast.LENGTH_SHORT) 
     .show(); 
    return true; 
} 
} 

,这里是在课堂上使用扩展的WebView的设置:

wv = (MoDaView) findViewById(R.id.webview); 
wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 
WebSettings wvOptions = wv.getSettings(); 
wvOptions.setJavaScriptEnabled(true); 
wvOptions.setGeolocationEnabled(false); 
wvOptions.setBuiltInZoomControls(true); 
wvOptions.setUseWideViewPort(true); 

这是检测的所有手势以上。我应该补充说这个类结合了来自stackoverflow的大约6个不同的答案。

还有一件事,为了拯救人们我所经历的。双击不是双指敲击。我认为这是(长话短说,我们会跳过它)。一个双手快一个手指两次。而且双指同时是两个 - 这就是我提到它的原因 - 并非所有手机都能检测到它。我打算使用它,但现在我将使用实际的双击。 Android有两个类来“伪造”双指手势,但他们说这些类不能在任何地方工作。仅供参考。