package org.qii.weiciyuan.support.lib;
import org.qii.weiciyuan.R;
import org.qii.weiciyuan.support.debug.AppLogger;
import org.qii.weiciyuan.support.utils.Utility;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.Activity;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
/**
* User: qii
* Date: 13-2-26
*/
public class MyViewPager extends ViewPager {
private Activity activity;
private GestureDetector gestureDetector;
private boolean isDragging = false;
private float[] firstPosition = new float[2];
private View topView;
private int operationItemPosition = -1;
private static final int OFFSET = 5;
private int max_motion_event_down_x_position;
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setGestureDetector(Activity activity, GestureDetector gestureDetector) {
this.activity = activity;
this.gestureDetector = gestureDetector;
this.topView = ((View) (activity.findViewById(android.R.id.content).getParent()));
this.max_motion_event_down_x_position = Utility.dip2px(25);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (operationItemPosition != 0) {
return super.onTouchEvent(ev);
}
if (this.gestureDetector == null) {
return super.onTouchEvent(ev);
}
if (this.gestureDetector != null) {
this.gestureDetector.onTouchEvent(ev);
}
if ((ev.getActionMasked() == MotionEvent.ACTION_UP
|| ev.getActionMasked() == MotionEvent.ACTION_CANCEL)
&& firstPosition[0] <= max_motion_event_down_x_position) {
int x = (int) (ev.getRawX() - firstPosition[0]);
firstPosition[0] = 0f;
firstPosition[1] = 0f;
isDragging = false;
if (x > (Utility.getScreenWidth() / 2)) {
activity.finish();
activity.overridePendingTransition(R.anim.stay, R.anim.swipe_right_to_close);
return true;
} else if (getCurrentItem() == 0) {
this.topView.animate().translationX(0)
.setDuration(300L).withLayer().setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
topView.animate().setListener(null);
}
});
}
}
if (isDragging) {
return true;
}
if (ev.getActionMasked() == MotionEvent.ACTION_MOVE) {
float x = ev.getRawX();
if ((x > firstPosition[0] + Utility.dip2px(OFFSET))
&& firstPosition[0] <= max_motion_event_down_x_position) {
AppLogger.e("begin swipe to right");
isDragging = true;
return true;
}
}
return super.onTouchEvent(ev);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (this.gestureDetector == null) {
return super.onTouchEvent(ev);
}
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
firstPosition[0] = ev.getRawX();
firstPosition[1] = ev.getRawY();
operationItemPosition = getCurrentItem();
break;
}
if (this.gestureDetector != null && ev.getActionMasked() == MotionEvent.ACTION_DOWN) {
this.gestureDetector.onTouchEvent(ev);
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (this.gestureDetector == null) {
return super.onTouchEvent(ev);
}
if (isDragging) {
return true;
}
if (operationItemPosition == 0) {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_MOVE:
float x = ev.getRawX();
if (x > firstPosition[0]
&& firstPosition[0] <= max_motion_event_down_x_position) {
return true;
}
break;
}
}
return super.onInterceptTouchEvent(ev);
}
}