2011-02-10 48 views
7

我正在实现一个扩展SimpleOnGestureListener的MyGestureDetector。我借用了该课程:http://www.codeshogun.com/blog/tag/view-flipper/以允许在ViewFlipper中进行滑动操作。我无法得到如果在模拟器上运行。有什么建议么?MyGestureDetector扩展SimpleOnGestureListener

下面是全部代码:

的main.java

import android.app.Activity; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.KeyEvent; 
import android.view.MotionEvent;import android.view.View; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.webkit.WebView; 
import android.widget.ViewFlipper; 


public class main extends Activity { 

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; 
private GestureDetector gestureDetector; 
View.OnTouchListener gestureListener; 
private Animation slideLeftIn; 
private Animation slideLeftOut; 
private Animation slideRightIn; 
private Animation slideRightOut; 
private ViewFlipper viewFlipper; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // ---------------------------------Sets Swipe Animation to Next View -->  
    viewFlipper = (ViewFlipper)findViewById(R.id.AC4313); 
    slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_left_in); 
    slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_left_out); 
    slideRightIn = AnimationUtils.loadAnimation(this, R.anim.slide_right_in); 
    slideRightOut = AnimationUtils.loadAnimation(this, R.anim.slide_right_out); 

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

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) { 
       viewFlipper.setInAnimation(slideLeftIn); 
       viewFlipper.setOutAnimation(slideLeftOut); 
       viewFlipper.showNext(); 
      } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       viewFlipper.setInAnimation(slideRightIn); 
       viewFlipper.setOutAnimation(slideRightOut); 
       viewFlipper.showPrevious(); 
      } 
     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 
}  

@Override // ------------------------------ Catch the Gesture Event by Overriding onTouch() method: --> 
public boolean onTouchEvent(MotionEvent event) { 
    if (gestureDetector.onTouchEvent(event)) 
     return true; 
    else 
     return false; 
} 

的动画* .XML的:

<?xml version="1.0" encoding="utf-8"?> 

<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="800"/> 
</set> 
+2

是什么行为? – 2011-02-10 01:45:17

回答

11

我认为这个问题是你不重写OnDown事件。将此代码片段添加到您的MyGestureDetector类,它应该是工作。

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

onDown事件返回false默认情况下,每一个动作开始onDown所以你onFling事件将不会触发。

伊什特万

2

好像你可以少了很多代码使用手势检测,现在解决这个问题,就像这样:

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.GridView; 

public class ScrollingGridView extends GridView { 
    private GestureDetector gestureDetector; 

    public ScrollingGridView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public ScrollingGridView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setupGestureListener(); 
    } 

    private void setupGestureListener() { 
     GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
       scrollBy((int)distanceX, (int)distanceY); 
       return true; 
      } 
     }; 
     gestureDetector = new GestureDetector(getContext(), gestureListener); 
     setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 
       gestureDetector.onTouchEvent(motionEvent); 
       return true; 
      } 
     }); 
    } 
}