package com.lgq.rssreader.controls;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Matrix;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.ScaleGestureDetector.OnScaleGestureListener;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.TranslateAnimation;
import android.webkit.WebView;
import android.widget.Toast;
import com.lgq.rssreader.R;
import com.lgq.rssreader.core.ReaderApp;
import com.lgq.rssreader.enums.MoveDirection;
public class GestureListener extends GestureDetector.SimpleOnGestureListener implements OnScaleGestureListener {
int oldEv = MotionEvent.ACTION_CANCEL;
boolean isScrolling = false;
MoveDirection direction;
float xDistance = 0;
float yDistance = 0;
int SWIPE_THRESHOLD_XDISTANCE = -1;
int SWIPE_THRESHOLD_YDISTANCE = -1;
IGestureListener listner;
View target;
public interface IGestureListener{
public void onDoubleTap();
public void onLeft();
public void onRight();
public void onDown();
public void onUp();
public void onScale(double scale);
}
public GestureListener(IGestureListener iGestureListener, View target, int xThreshold, int yThreshold) {
this.listner = iGestureListener;
this.target = target;
SWIPE_THRESHOLD_XDISTANCE = xThreshold;
SWIPE_THRESHOLD_YDISTANCE = yThreshold;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
if(listner != null){
listner.onDoubleTap();
}
return true;
}
void printSamples(MotionEvent ev) {
final int historySize = ev.getHistorySize();
final int pointerCount = ev.getPointerCount();
// for (int h = 0; h < historySize; h++) {
// System.out.printf("At time %d:", ev.getHistoricalEventTime(h));
// for (int p = 0; p < pointerCount; p++) {
// System.out.printf(" pointer %d: (%f,%f)", ev.getPointerId(p), ev.getHistoricalX(p, h), ev.getHistoricalY(p, h));
// }
// }
//System.out.printf("At time %d:", ev.getEventTime());
for (int p = 0; p < pointerCount; p++) {
Log.i("RssReader", "pointer " + ev.getPointerId(p) + ": (" + ev.getX(p) + "," + ev.getY(p) + ")");
}
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
xDistance = xDistance + distanceX;
yDistance = yDistance + distanceY;
printSamples(e2);
//if(Math.abs(distanceX) > 50){
if(Math.abs(xDistance) > SWIPE_THRESHOLD_XDISTANCE && Math.abs(yDistance) < SWIPE_THRESHOLD_YDISTANCE){
if(distanceX > 0 )
direction = MoveDirection.Left;
else
direction = MoveDirection.Right;
TranslateAnimation animation = new TranslateAnimation(target.getX() - xDistance, target.getX(),0,0);
animation.setDuration(1000);
target.startAnimation(animation);
animation.start();
isScrolling = true;
return true;
}
if(Math.abs(xDistance) < SWIPE_THRESHOLD_XDISTANCE && Math.abs(yDistance) > SWIPE_THRESHOLD_YDISTANCE){
if(distanceY > 0 )
direction = MoveDirection.Down;
else
direction = MoveDirection.Up;
isScrolling = true;
return true;
}
return true;
}
public void onScrollComplete(MotionEvent e){
isScrolling = false;
Log.i("RssReader", "Scroll ends");
if(Math.abs(xDistance) > SWIPE_THRESHOLD_XDISTANCE){
if(direction == MoveDirection.Right){
listner.onLeft();
}
if(direction == MoveDirection.Left){
listner.onRight();
}
}
if(Math.abs(yDistance) > SWIPE_THRESHOLD_YDISTANCE){
if(direction == MoveDirection.Down){
listner.onDown();
}
}
if(e.getAction() == MotionEvent.ACTION_UP && Math.abs(yDistance) * 2 > SWIPE_THRESHOLD_YDISTANCE){
if(direction == MoveDirection.Up){
listner.onUp();
}
}
xDistance = 0;
yDistance = 0;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
return false;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
float scale = detector.getScaleFactor();
listner.onScale(scale);
}
}