2012-03-20 63 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有兩個類來「僞造」雙指手勢,但他們說這些類不能在任何地方工作。僅供參考。