android 手势判断封装(1)

package com.kindlion.media.ActionForOnTouchListener;


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;

}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值