2011-12-20 20 views
3

我希望你能幫助我弄清楚爲什麼OnSwipe,OnDoubleTap和onSingTapConfirmed方法在我的CustomView類中的定義從活動中實例化的onCreate使用以下行 -姿態探測器與一個基於視圖的自定義類

CustomView customView = new CustomView(this); 

沒有被調用。 CustomView擴展了View並實現了MyGestureListener接口。見下面的代碼。

public class CustomView extends View implements MyGestureListener { 

private MyGestureDetector mGestureDetector; 

public CustomView(Context context) { 
     super(context); 

    mGestureDetector = new MyGestureDetector(context, this); 
} 

@Override 
public boolean dispatchTouchEvent(MotionEvent me){ 
    this.mGestureDetector.onTouchEvent(me); 
    return super.dispatchTouchEvent(me); 
} 

@Override 
public void onSwipe(int direction) { 
    String str = ""; 

    switch (direction) { 

     case MyGestureDetector.SWIPE_RIGHT : 
       str = "Swipe Right"; 
       break; 
     case MyGestureDetector.SWIPE_LEFT : 
       str = "Swipe Left"; 
       break; 
     case MyGestureDetector.SWIPE_DOWN : 
       str = "Swipe Down"; 
       break; 
     case MyGestureDetector.SWIPE_UP :  
       str = "Swipe Up"; 
       break;           
    } 

    Toast.makeText(getContext(), str, Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onDoubleTap() { 
     Toast.makeText(getContext(), "Double Tap", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onSingleTapConfirmed() { 
    Toast.makeText(getContext(), "Single Tap", Toast.LENGTH_SHORT).show(); 
} 

} 

public class MyGestureDetector extends GestureDetector.SimpleOnGestureListener{ 

public final static int SWIPE_UP = 1; 
public final static int SWIPE_DOWN = 2; 
public final static int SWIPE_LEFT = 3; 
public final static int SWIPE_RIGHT = 4; 

public final static int MODE_TRANSPARENT = 0; 
public final static int MODE_SOLID  = 1; 
public final static int MODE_DYNAMIC  = 2; 

private final static int ACTION_FAKE = -13; 
private int swipe_Min_Distance = 100; 
private int swipe_Max_Distance = 350; 
private int swipe_Min_Velocity = 100; 

private int mode  = MODE_TRANSPARENT; 
private boolean running = true; 
private boolean tapIndicator = false; 

private Context context; 
private GestureDetector detector; 
private MyGestureListener listener; 

public MyGestureDetector(Context context, MyGestureListener sgl) { 

    this.context = context; 
    this.detector = new GestureDetector(context, this); 
    this.listener = sgl; 
} 


public void onTouchEvent(MotionEvent event){ 

    if(!this.running) 
     return; 

    boolean result = this.detector.onTouchEvent(event); 

    if(this.mode == MODE_SOLID) 
     event.setAction(MotionEvent.ACTION_CANCEL); 
    else if (this.mode == MODE_DYNAMIC) { 

    if(event.getAction() == ACTION_FAKE) 
     event.setAction(MotionEvent.ACTION_UP); 
    else if (result) 
     event.setAction(MotionEvent.ACTION_CANCEL); 
    else if(this.tapIndicator){ 
     event.setAction(MotionEvent.ACTION_DOWN); 
     this.tapIndicator = false; 
    } 

    } 
    //else just do nothing, it's Transparent 

} 


public void setMode(int m){ 
    this.mode = m; 
} 

public int getMode(){ 
    return this.mode; 
} 

public void setEnabled(boolean status){ 
    this.running = status; 
} 

public void setSwipeMaxDistance(int distance){ 
    this.swipe_Max_Distance = distance; 
} 

public void setSwipeMinDistance(int distance){ 
    this.swipe_Min_Distance = distance; 
} 

public void setSwipeMinVelocity(int distance){ 
    this.swipe_Min_Velocity = distance; 
} 

public int getSwipeMaxDistance(){ 
    return this.swipe_Max_Distance; 
} 

public int getSwipeMinDistance(){ 
    return this.swipe_Min_Distance; 
} 

public int getSwipeMinVelocity(){ 
    return this.swipe_Min_Velocity; 
} 


@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
    float velocityY) { 

    final float xDistance = Math.abs(e1.getX() - e2.getX()); 
    final float yDistance = Math.abs(e1.getY() - e2.getY()); 

    if(xDistance > this.swipe_Max_Distance || yDistance > this.swipe_Max_Distance) 
    return false; 

    velocityX = Math.abs(velocityX); 
    velocityY = Math.abs(velocityY); 
     boolean result = false; 

    if(velocityX > this.swipe_Min_Velocity && xDistance > this.swipe_Min_Distance){ 
    if(e1.getX() > e2.getX()) // right to left 
    this.listener.onSwipe(SWIPE_LEFT); 
    else 
    this.listener.onSwipe(SWIPE_RIGHT); 

    result = true; 
    } 
    else if(velocityY > this.swipe_Min_Velocity && yDistance > this.swipe_Min_Distance){ 
    if(e1.getY() > e2.getY()) // bottom to up 
    this.listener.onSwipe(SWIPE_UP); 
    else 
    this.listener.onSwipe(SWIPE_DOWN); 

    result = true; 
    } 

    return result; 
} 

@Override 
public boolean onSingleTapUp(MotionEvent e) { 
    this.tapIndicator = true; 
    return false; 
} 

@Override 
public boolean onDoubleTap(MotionEvent arg0) { 
    this.listener.onDoubleTap(); 
    return true; 
} 

@Override 
public boolean onDoubleTapEvent(MotionEvent arg0) { 
    return true; 
} 

@Override 
public boolean onSingleTapConfirmed(MotionEvent arg0) {; 
    this.listener.onSingleTapConfirmed(); 
    return true; 
} 

static interface MyGestureListener{ 
    void onSwipe(int direction); 
    void onDoubleTap(); 
    void onSingleTapConfirmed(); 
} 
} 

回答

0

您應該返回true在上下運動......否則其他的回調動作不會被調用......在android doc

小心創建了ACTION_DOWN返回false聽衆解釋事件。如果您這樣做,則不會爲後續的ACTION_MOVE和ACTION_UP事件串調用偵聽器。這是因爲ACTION_DOWN是所有觸摸事件的起點。

相關問題