package net.dev123.yibo.service.listener;
import net.dev123.yibo.ImageViewer4GifActivity;
import net.dev123.yibo.R;
import net.dev123.yibo.common.CompatibilityUtil;
import android.app.Activity;
import android.content.Context;
import android.view.Display;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.Toast;
public class SlideFinishOnGestureListener implements OnGestureListener {
//mdpi下的比例计算;
private static final float FACTOR_PORTRAIT;
private static final float FACTOR_LANDSCAPE;
//手指在屏幕上移动距离小于此值不会被认为是手势
private static int SLIDE_MIN_DISTANCE_X;
private static int SLIDE_MAX_DISTANCE_Y;
private static int DISPLAY_WINDOW_WIDTH;
private static int DISPLAY_WINDOW_HEIGHT;
static {
FACTOR_PORTRAIT = 100f / 320;
FACTOR_LANDSCAPE = FACTOR_PORTRAIT;
}
private Context context;
private SlideDirection slideDirection;
//划动方向
public enum SlideDirection {
NONE,
LEFT,
RIGHT,
TOP,
BOTTOM
}
public SlideFinishOnGestureListener(Context context, SlideDirection slideDirection) {
this.context = context;
this.slideDirection = slideDirection;
initEnv(context);
}
private void initEnv(Context context) {
// 获得屏幕大小
WindowManager windowManager = ((Activity)context).getWindowManager();
Display display = windowManager.getDefaultDisplay();
DISPLAY_WINDOW_WIDTH = display.getWidth();
DISPLAY_WINDOW_HEIGHT = display.getHeight();
SLIDE_MIN_DISTANCE_X = (int)(DISPLAY_WINDOW_WIDTH * FACTOR_PORTRAIT);
SLIDE_MAX_DISTANCE_Y = (int)(DISPLAY_WINDOW_HEIGHT * FACTOR_LANDSCAPE);
//orientation = context.getResources().getConfiguration().orientation;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
float x1 = (e1 != null ? e1.getX() : 0);
float x2 = (e2 != null ? e2.getX() : 0);
float y1 = (e1 != null ? e1.getY() : 0);
float y2 = (e2 != null ? e2.getY() : 0);
float distanceX = x1 - x2;
float distanceY = y1 - y2;
if (distanceX > 0
&& Math.abs(distanceX) > SLIDE_MIN_DISTANCE_X
&& Math.abs(distanceY) < SLIDE_MAX_DISTANCE_Y
&& slideDirection == SlideDirection.LEFT) {
//slide to left
if (context instanceof ImageViewer4GifActivity) {
((ImageViewer4GifActivity)context).onBackPressed();
} else {
((Activity)context).finish();
}
CompatibilityUtil.overridePendingTransition(
((Activity)context), R.anim.slide_in_right, android.R.anim.fade_out
);
return true;
} else if (
distanceX < 0
&& Math.abs(distanceX) > SLIDE_MIN_DISTANCE_X
&& Math.abs(distanceY) < SLIDE_MAX_DISTANCE_Y
&& slideDirection == SlideDirection.RIGHT) {
//slide to right
if (context instanceof ImageViewer4GifActivity) {
((ImageViewer4GifActivity)context).onBackPressed();
} else {
((Activity)context).finish();
}
CompatibilityUtil.overridePendingTransition(
((Activity)context), R.anim.slide_in_left, android.R.anim.fade_out
);
return true;
}
if (Math.abs(distanceX) > SLIDE_MIN_DISTANCE_X
&& Math.abs(distanceY) < SLIDE_MAX_DISTANCE_Y) {
if (slideDirection == SlideDirection.LEFT) {
Toast.makeText(context, context.getString(R.string.msg_gesture_left), Toast.LENGTH_SHORT).show();
} else if (slideDirection == SlideDirection.RIGHT) {
Toast.makeText(context, context.getString(R.string.msg_gesture_right), Toast.LENGTH_SHORT).show();
}
}
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
public SlideDirection getSlideDirection() {
return slideDirection;
}
public void setSlideDirection(SlideDirection slideDirection) {
this.slideDirection = slideDirection;
}
}