import android.annotation.SuppressLint;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class MyOnTouchListener implements OnTouchListener {
/**
* 开始时候的X坐标
*/
private float startX = 0;
/**
* 开始时候的Y坐标
*/
private float startY = 0;
/**
* 用于传递消息的句柄
*/
private Handler mHandler;
/**
* 当前判定的手势是什么
*/
private int currentAction = 0;
/**
* 默认为Y轴的滑动判断
*/
private GestureType Type = GestureType.GESTURE_ONLY_Y;
/**
* 当前手势是否已锁定
*/
private boolean isLocked = false;
/**
* 滑动的最小距离
*/
private static final int minDistance = 20;
/**
* 屏幕宽度
*/
private int screenWidth = 0;
/**
* touch事件返回值
*/
private boolean withoutOther = true;
/**
* 构造方法
* @param mHandler 传入消息句柄
* @param Type 手势类型
*/
public MyOnTouchListener(Handler mHandler,GestureType Type) {
this.mHandler = mHandler;
this.Type = Type;
}
@SuppressLint("ClickableViewAccessibility") @Override
public boolean onTouch(View v, MotionEvent event) {
screenWidth = v.getWidth();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isLocked = false;
startX = event.getX();
startY = event.getY(); //获取当前的Y坐标
currentAction = TouchActionType.ACTION_TOUCH_DOWN;
mHandler.sendEmptyMessage(currentAction);
break;
case MotionEvent.ACTION_MOVE:
float moveX = event.getX();
float moveY = event.getY(); //获取移动的时候的Y坐标
PDAciton(moveX,moveY);
break;
case MotionEvent.ACTION_UP:
isLocked = false;
currentAction = TouchActionType.ACTION_TOUCH_UP;
mHandler.sendEmptyMessage(currentAction);
break;
default:
break;
}
return withoutOther;
}
public boolean isWithoutOther() {
return withoutOther;
}
/**
*
* @param withoutOther
*/
public void setWithoutOther(boolean withoutOther) {
this.withoutOther = withoutOther;
}
/**
* 判断当前的手势动作
* @param moveX 手指在x轴滑动到距离
* @param moveY 手指在y轴滑动到距离
*/
private void PDAciton(float moveX,float moveY) {
if(isLocked){ //当前动作已经判断完毕,不做任何操作
return;
}
float gapX = moveX - startX; //和上一次X轴的差距
float gapY = moveY - startY; //和上一次Y轴的差距
switch (Type) {
case GESTURE_ONLY_Y:
if(Math.abs(gapY) < minDistance){ //滑动距离过小,不予理会
// Log.e("sssssssssss", "距离过小!"+gapY);
return;
}
DoOnlyY(gapY);
break;
case GESTURE_ONLY_X:
if(Math.abs(gapX) < minDistance){ //滑动距离过小,不予理会
// Log.e("sssssssssss", "距离过小!"+gapX);
return;
}
DoOnlyX(gapX);
break;
case GESTURE_BOTH_XY:
if(Math.abs(gapX) < minDistance && Math.abs(gapY) < minDistance){ //滑动距离过小,不予理会
return;
}
DoBothXY(gapX,gapY);
break;
case GESTURE_X_LEFTY_RIGHTY:
if(Math.abs(gapX) < minDistance && Math.abs(gapX) < minDistance){ //滑动距离过小,不予理会
// Log.e("sssssssssss", "距离过小!");
return;
}
// Log.e("sssssssssss", "距里合适!");
DoXAndLYAndRY(gapX,gapY);
break;
default:
break;
}
}
/**
* 只判断Y轴的手势
* @param gapY y轴上面滑动的距离
*/
private void DoOnlyY(float gapY) {
if(gapY >0){ //手指下拉刷新
currentAction = TouchActionType.ACTION_Y_DOWN;
}else{ // 手势上拉加载更多
currentAction = TouchActionType.ACTION_Y_UP;
}
mHandler.sendEmptyMessage(currentAction);
isLocked = true;
}
/**
* 只判断X轴的手势
* @param moveX
*/
private void DoOnlyX(float gapX) {
if(gapX > 0){ //从左往右滑
currentAction = TouchActionType.ACTION_X_RIGHT;
Log.e("右滑", "右滑");
}else{ //从右往左滑
currentAction = TouchActionType.ACTION_X_LEFT;
Log.e("左滑", "左滑");
}
mHandler.sendEmptyMessage(currentAction);
isLocked = true;
}
/**
* 同时判断X轴和Y轴的手势
* @param moveX
* @param moveY
*/
private void DoBothXY(float gapX,float gapY) {
if(Math.abs(gapX) > Math.abs(gapY)){ //如果x轴滑动到距离比较大,则判断为x轴事件
DoOnlyX(gapX);
}else{
DoOnlyY(gapY);
}
}
/**
*
* @param moveX
* @param moveY
*/
private void DoXAndLYAndRY(float gapX,float gapY) {
double middle = screenWidth / 2.0;
if(Math.abs(gapX) > Math.abs(gapY)){ //如果x轴滑动到距离比较大,则判断为x轴事件
DoOnlyX(gapX);
Log.e("X轴动作", "X轴动作");
}else{
if(startX < middle){ //Y轴左屏,
if(gapY >0){ //手指下拉刷新
currentAction = TouchActionType.ACTION_Y_LEFT_DOWN;
Log.e("手指下拉刷新", "左屏");
}else{ // 手势上拉加载更多
currentAction = TouchActionType.ACTION_Y_LEFT_UP;
Log.e("手势上拉加载更多", "左屏");
}
}else{
if(gapY >0){ //手指下拉刷新
currentAction = TouchActionType.ACTION_Y_RIGHT_DOWN;
}else{ // 手势上拉加载更多
currentAction = TouchActionType.ACTION_Y_RIGHT_UP;
}
}
mHandler.sendEmptyMessage(currentAction);
isLocked = true;
}
}
/**
* 获取当前的action是什么
* @return
*/
public int getCurrentAction() {
return currentAction;
}
/**
* 获取当前是否已判定动作
* @return
*/
public boolean isLocked() {
return isLocked;
}
}
package com.kindlion.media.ActionForOnTouchListener;
/**
* 枚举类型
* 说明到底需要判断的手势有哪些
* 只判断Y轴,只判断X轴,或者Y轴X轴都要判断
* @author Administrator
*
*/
public enum GestureType {
/**
* 只判断Y轴
*/
GESTURE_ONLY_Y,
/**
* 只判断X轴
*/
GESTURE_ONLY_X,
/**
* 同时判断X轴和Y轴
*/
GESTURE_BOTH_XY,
/**
* 不仅仅判断x轴 ,y轴,
* 同时判断y轴是在左半屏幕滑动还是右半屏幕滑动
*/
GESTURE_X_LEFTY_RIGHTY;
}
package com.kindlion.media.ActionForOnTouchListener;
public class TouchActionType {
/**
* 手指接触到屏幕
*/
publicstatic finalint ACTION_TOUCH_DOWN = 0x0001;
/**
* 手指从屏幕上拿起
*/
publicstatic finalint ACTION_TOUCH_UP = 0x0002;
/**
* X轴左滑手势
*/
publicstatic finalint ACTION_X_LEFT = 0x0003;
/**
* X轴右滑手势
*/
publicstatic finalint ACTION_X_RIGHT = 0x0004;
/**
* Y轴上拉手势 如上拉加载更多
*/
publicstatic finalint ACTION_Y_UP = 0x0005;
/**
* Y轴下拉手势,如下拉刷新
*/
publicstatic finalint ACTION_Y_DOWN = 0x0006;
/**
* Y轴上拉手势 左屏
*/
publicstatic finalint ACTION_Y_LEFT_UP = 0x0007;
/**
* Y轴下拉手势 左屏
*/
publicstatic finalint ACTION_Y_LEFT_DOWN = 0x0008;
/**
* Y轴上拉手势 右屏
*/
publicstatic finalint ACTION_Y_RIGHT_UP = 0x0009;
/**
* Y轴下拉手势 右屏
*/
publicstatic finalint ACTION_Y_RIGHT_DOWN = 0x0010;
}