package com.ch_linghu.fanfoudroid.ui.module;
import com.ch_linghu.fanfoudroid.R;
import android.app.Activity;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
/**
* FlingGestureLIstener, 封装 {@link SimpleOnGestureListener} .
* 主要用于识别类似向上下或向左右滑动等基本手势.
*
* 该类主要解决了与ListView自带的上下滑动冲突问题. 解决方法为将listView的onTouchListener进行覆盖:<code>
* FlingGestureListener gListener = new FlingGestureListener(this,
* MyActivityFlipper.create(this));
* myListView.setOnTouchListener(gListener);
* </code>
*
* 该类一般和实现了 {@link Widget.OnGestureListener} 接口的类共同协作. 在识别到手势后会自动调用其相关的回调方法,
* 以实现手势触发事件效果.
*
* @see Widget.OnGestureListener
*
*/
public class FlingGestureListener extends SimpleOnGestureListener implements
OnTouchListener {
private static final String TAG = "FlipperGestureListener";
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_DISTANCE = 400;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private Widget.OnGestureListener mListener;
private GestureDetector gDetector;
private Activity activity;
public FlingGestureListener(Activity activity,
Widget.OnGestureListener listener) {
this(activity, listener, null);
}
public FlingGestureListener(Activity activity,
Widget.OnGestureListener listener, GestureDetector gDetector) {
if (gDetector == null) {
gDetector = new GestureDetector(activity, this);
}
this.gDetector = gDetector;
mListener = listener;
this.activity = activity;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
Log.d(TAG, "On fling");
boolean result = super.onFling(e1, e2, velocityX, velocityY);
float xDistance = Math.abs(e1.getX() - e2.getX());
float yDistance = Math.abs(e1.getY() - e2.getY());
velocityX = Math.abs(velocityX);
velocityY = Math.abs(velocityY);
try {
if (xDistance > SWIPE_MAX_DISTANCE
|| yDistance > SWIPE_MAX_DISTANCE) {
Log.d(TAG, "OFF_PATH");
return result;
}
if (velocityX > SWIPE_THRESHOLD_VELOCITY
&& xDistance > SWIPE_MIN_DISTANCE) {
if (e1.getX() > e2.getX()) {
Log.d(TAG, "<------");
result = mListener
.onFlingLeft(e1, e1, velocityX, velocityY);
activity.overridePendingTransition(R.anim.push_left_in,
R.anim.push_left_out);
} else {
Log.d(TAG, "------>");
result = mListener.onFlingRight(e1, e1, velocityX,
velocityY);
activity.overridePendingTransition(R.anim.push_right_in,
R.anim.push_right_out);
}
} else if (velocityY > SWIPE_THRESHOLD_VELOCITY
&& yDistance > SWIPE_MIN_DISTANCE) {
if (e1.getY() > e2.getY()) {
Log.d(TAG, "up");
result = mListener.onFlingUp(e1, e1, velocityX, velocityY);
} else {
Log.d(TAG, "down");
result = mListener
.onFlingDown(e1, e1, velocityX, velocityY);
}
} else {
Log.d(TAG, "not hint");
}
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG, "onFling error " + e.getMessage());
}
return result;
}
@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
super.onLongPress(e);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d(TAG, "On Touch");
// Within the MyGestureListener class you can now manage the
// event.getAction() codes.
// Note that we are now calling the gesture Detectors onTouchEvent.
// And given we've set this class as the GestureDetectors listener
// the onFling, onSingleTap etc methods will be executed.
return gDetector.onTouchEvent(event);
}
public GestureDetector getDetector() {
return gDetector;
}
}